当前位置: 网学 > 编程文档 > Android > 正文

android 面试题

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: myeducs.cn 发布时间: 13/03/17

【网学网提醒】:网学会员,鉴于大家对android 面试题十分关注,会员在此为大家搜集整理了“android 面试题”一文,供大家参考学习!


    1.什么是android(能干什么)
    2.安装
    3.(第一个示例)理解应该程序架构关系
    4.DDMS(DalvikDebugMonitorService)的使用
    5.事件和Intent初步
    7.Activity
    1).回顾:Activity生命周期:一方面,启动Activity,界面可见,转向home界面不可见,再让Activity可见。
    另一方面:启动Activity,让界面可见,再让界面为半可见状态,再让界面为完全可见
    调用destroy方法
    2).android组织Activity的方式:当显示第一界面时,android会把界面对象放入栈顶,当转向第二个界面时,第二个界面显示,同时它位于栈顶,而第一个界面,被放入第二位。当从第二个界面back到第一个界面时,第二个界面会出栈,第一个界面变为栈顶(结合生命周期方法的调用)
    8.service生命周期
    service是一种没界面的Activity,它主要运行后台,从启动开始,它会一直存在,除非系统资源紧缺,系统才会把它销毁掉。
    1)service生命周期控制:
    需求,如何做到一个在Activity界面中,控制service生命周期呢(也就是说让其开始,让其销毁,他就销毁)?
    2)在Activity中,如何获取service对象(难道要直接实例化吗?)
    为此android提供了绑定机制,当Activity和service绑定成功时,android自动会service对象返回给Activity.
    3)音乐播放
    9.在上面的音乐播放中,如何做到播放完之后,更改界面,提示播放结束?为此
    咱们可以在界面类中创建一个广播接收器,在service中,如果音乐播放结束,可以发布一个音乐播放结束的信息,就可以了。
    另外,我们也可以把广播接收器在menifest中注册(但是更改界面非常困难)
    BroadcastReceiver生命周期
    10.在上面我们实现了三个组件之间交互,那么在交互的同时,如何实现传值呢?
    为此,android提供了Intent,这个类咱们用过了,它除了可以实现转向之外,还可以传值
    在Intent对象中,可以存储三大种类的数据
    10.1可以存储基本类型和ArrayList(intent.putStringArrayListExtra()存getStringArrayListExtra()取,用putExtra()用对应类型取)
    10.2可以存储Bundle类型的数据(intent.putExtras(),intent.getExtras()取)
    10.3可以存储对象类型的数据,但要求实现Serializable接口(intent.putExtra(),使用getSerializable()取值)
    更改实例:
    10.4Activity之间传值
    11.布局
    11.1android组织组件的方式:它是以布局为根节点,以控件(View)为子节点来组织的,其中子节点也可以是布局(ViewGroup)。
    ViewGroup和组件(文本框)都是View的子类
    11.2线性布局
    需求:如何做到组件之间是水平或竖直显示呢?为此android提供了线性布局。
    画一个图画在上,文字在下
    11.3相对布局
    在布局文件中,如何做到让一个组件的显示
    相对于其它组件呢(如,按钮2显示在按钮1的左边或者下边,上边等等)?这时,我们可以通过相对布局,来布局我们的界面
    在相对布局文件中,是通过以下几个属性来实现相对的:
    android:layout_centerHorizontal="true"是否显示到父视图的水平中间
    android:layout_below显示某组件的下面
    android:layout_toRightOf显示到哪个组件的右边
    android:layout_alignLeft当前组件与指定的组件左对齐
    android:layout_margin:指定组件边外距离
    11.4表格布局
    需求:如何做到像表格一样组织我们的组件呢?
    android:shrinkColumns="0,1"表示当一行中,组件显示不下时,0和1列会变成竖显示。
    android:collapseColumns="1,2"折叠1和2列
    android:stretchColumns="3"延伸3列,当空间有剩余时,第3列会延伸
    11.5绝对布局
    再显示布局时,如何做到把组件定位到某个地方呢?为此android提供了绝对布局
    它的属性:android:layout_x定位的横坐标
    android:layout_y定位的纵坐标
    11.6滚动布局
    当组件过多时,默认下,多余的组件不显示,为此我们要能通过ScrollView来实现滚动,注意ScrollView只能有一个直接节点(为了实现在滚动布局中,显示组件,我们可以在里再用线性布局)
    11.7tab布局
    在组织组件时,如何把组件组织成像应用程序管理那样呢(显示tab)?
    为此android提供了tab布局
    0)LayoutInflater是用来向父视图添加子视图的,或者单独用。
    LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);
    1)在做tab布局时,需要让Activity继承于TabActitvity
    2)TabHost:它是用来组织每一个tab的,程序员可以向其上添加tab,可以通过父类获取TabHost对象(getTabHost())
    3)tabHost.addTab();是用来向tabhost上添加tab子页的,其参数是(TabSepc),可以通过tabHost.newTabSpec("tab1")创建,tab1为该tab的id。
    TabSepc常用方法:TabSepc.setIndicator()添加指示器用于显示子标签上,同时可以添加图片
    TabSepc.setContent()设置内容,它是一个子视图,可以是一个文本框及复合的
    4)tab事件OnTabChangedListener(可以得到tabId)
    5)复合视图
    11.8grid布局:
    如何把我们的数据显示像模拟器的应用程序呢?为此android提供了网格布局,它能够把每一项数据显示成一个小方格,那么如何把每一项数据显示到方格里呢?
    首先:我们要用ArrayList>来存储我们每一项数据,因为每一项数据有两个一是图片一个是字符串。
    其次:为了把数据绑定到grid上面,我们要通过适配器(SimpleAdapter)来实现,这个适配器能够把ArrayList>类型的数据绑定到gird上面。
    再次:我们如何处理每项的数据事件呢,因此我们可以
    通过OnItemClickListener(第一个参数表示当前的GridView,第二个参数Viewarg1指的是适配器中指定的布局,最后一个参数表示第几个方块)来实现。
    最后:常用方法
    grid.setNumColumns(4);//设置每行有几列
     grid.setSelection(3);//设置选中项
     grid.setVerticalSpacing(20);//设置行之间列距
     grid.setHorizontalSpacing(10);//设置列间距
    注:需要一个girid.xml和griditem.xml
    
    11.9复合布局
    在10.1中,提到子节点可以是布局,所以,咱们可以实现布局的嵌套,在这里咱们用一下
    我们实现ScrollView布局嵌套线性布局再嵌套绝对布局
    12.图片组件ImageView;
    在android中,如何实现对布局中的图片显示及放大缩小和旋转呢?
    Matrix类:是用来存储放大缩小旋转比例的
    BitmapFactory:它可以从资源文件中读取到图片(缩小比例要一样大小)
    //bitmapexceeds32bits
    (核心)Bitmap.createBitmap(map,x,y,width,height,m,filter);该方法是用来创建位图
    13.RadioButton:单选按钮
    如何显示出用户所做的选择,注意,要把RadioButton放入
    14.CheckBox
    如何显示出用户所做的选择.
    15.AutoCompleteTextView:这是一个提示文本框,就像百度一样,当输入几个字符时,就能提示,那么在android该如何实现呢?
    这里涉及一个概念:适配器(ArrayAdapter):它是一种把外部数据源绑定到视图上的工具。选择布局:android.R.layout.simple_spinner_item能看得到或者自定义布局。
    android:completionThreshold=1//表示输入1个字符提示
    16.ImageButton:它是一个图片按钮:那么通过此铵钮如何实现图片交换呢,也就是说单击某一个按钮时,被的单击按钮的图片,换到另一个按钮,而另一个按钮的图片换到自己的身上。
    17.Sppiner选择处理:如何开发一个拉框并实现取出所选择的值
    需要处理OnItemSelectedListener事件,ItemOnclickListenr不支持。
    18.Gallery相簿:
    在android中,如何实现一个可以拖拽的照片相簿(它是一个相框莲,我们要为他的每一个链填充照片,所以我们要用适配器来实现填充)呢?为此android提供了Gallery组件
    下面是引用系统的Gallery的属性,从1.5以后,它不能直接使用,要想使用必须在attrs.xml文件中声明,然后才能使用,attrs.xml文件通常用于自定义控件时,在此文件中声明属性。
    
    
    
    
    

    TypedArrayt=obtainStyledAttributes(R.styleable.gallery);
    back=t.getResourceId(R.styleable.gallery_android_galleryItemBackground,0);
    //设置在父布局中的宽度高度
    imageView.setLayoutParams(newGallery.LayoutParams(80,108));
    //设置图片如何在ImageView中
    显示
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    ImageViewimg=newImageView(c);
    img.setImageResource(image[arg0]);
    img.setLayoutParams(newGallery.LayoutParams(80,100));
    img.setScaleType(ScaleType.FIT_XY);
    img.setBackgroundResource(back);
    returnimg;
    事件处理:
    Gallery.setOnItemSelectedListener(listener);是用来处理选择的某一项数据的。
    
    19.进度条ProgressBar:
    在下载过程中,通常会记录内容下载的进度信息,为此android提供了ProgressBar.
    1)显示
    //使用系统提供的样式表,设置进度条为横向显示
    @android:style/Widget.ProgressBar.Horizontal
    //显示进度条的最大值。
    pb.setMax(100);
    //设置是否可见
    pb.setVisibility(View.INVISIBLE);
    //设置进度值
    pb.setProgress()
    2).更新进度条
    由于更新进度条是一个慢长过程,所以通常会单做一个线程实现时间较长的功能,但是在android中一个新的线程不能操作UI的元素(如:TextView),所以为了实现新线程与主线程的通信,android提供了Handler、Looper、Message三个类:
    Handler:通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。每个Handler都会与唯一的一个线程以及该线程的消息队列对应。
    Message:是一个消息队列,用来存放通过Handler发布的消息,消息队列通常附属于某一个创建它的线程。
    Looper:Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传送给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。
    20.时间与日期的选择
    在android中,如何做选择日期,然后把选择的日期添加到文本框呢?
    为此android提供了DatePicker和TimePicker日期与时间控件
    只要把这两个控件加到布局文件中,在oncreate里为两个控件添加监听就可以
    注:年月日传错了start<    DatePicker.init(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH)+1,cal.get(Calendar.DAY_OF_MONTH),onDateChangedListener);
    TimePicker.setOnTimeChangedListener(onTimeChangedListener);
    
    21.ListActivity:在开发中,经常把数据信息显示列表中,如:settings,它是以图文并茂的方式来显示每一行,为此android提供了ListActivity类,此类也是一Activity,它可以帮助我们达到我们的愿望。
    21.1简单列表
    知识点:创建一类继承于ListActivity,创建显示于列表中的数组,每个值是列表一项,
    用数据适配器把数组设置到ListActivity的适配器中
    通过devider属性可以设置分条的图片和顔色,
    android:dividerHeight="0.8px"设置分隔高度
    android:choiceMode="singleChoice"设置列表项的选择模式
    注:android:id="@id/android:list"id必须如此
    21.2图文并茂的列表项
    知识点:需要显
    示的数据,可以是数组。
    自定义适配器,继承于BaseAdapter,重写里的方法,在getView方法中,需要用Viewv=LayoutInflater.from(c).inflate(R.layout.listitem,null);从布局文件中加载信息
    注:布局的显示方式决定了在列表的显示方式,从v中获取文本框,设置值,返回v就可以了
    21.3事件处理
    重写onListItemClick方法
    21.4直接使用ListView,也可以达到此效果。更改程序让其继承于Activity
    list.setAdapter()
    list.setOnItemClickListener()
    22.Notification在android中,可以实现,在电源处提示一些信息
    它涉及两个类
    1.NotificationManager管理通知的,它能控制通知的显示与关闭,
    nm.cancel(id)取消通知
    nm.notify()通知Notification来显示的
    Notificationn=newNotification(R.drawable.icon,"天气预报",System.currentTimeMillis());它描述了通知的显示
    //设置下拉页面所显示的界面,in规定了单击标题时,从哪转到哪
    notification.setLatestEventInfo(MyTabActivity.this,"吃饭了","有大雪",in);
    23.SeekBar:它是一个特殊进度条,它间接继承于ProgressBar,它与ProgressBar的区别是,它比ProgressBar多了一个可以拖动的东东。
    //从布局中获得seekbar
    SeekBarbar=(SeekBar)findViewById(R.id.seekbar);
    //设置其最大值为100
    bar.setMax(100);
    //设置其可见
    bar.setVisibility(View.VISIBLE);
    bar.setOnSeekBarChangeListener(l);//当拖动时,会调用它onStartTrackingTouch(滑块开始)、onProgressChanged(滑块进行中),onStopTrackingTouch(滑块停止)
    24.RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定。使用RatingBar的默认大小时,用户可以触摸/拖动或使用键来设置评分,它有两种样式(小风格用ratingBarStyleSmall,大风格用ratingBarStyleIndicator),其中大的只适合指示,不适合于用户交互。
    android:stepSize="0.3"//每次移动步长
    android:numStars="5"//显示为几星
    android:rating="5"//分值(每星一分)
    style="?android:attr/ratingBarStyle"//?表示引用当前主题下的属性,ratingBarStyle为默认值,另外两个值为:?android:attr/ratingBarStyleIndicator(作指示器用),style="?android:attr/ratingBarStyleSmall"//表示用小星型表示
    android:layout_width="wrap_content"
    RatingBar可以通过setRating来更改分值,它有一个OnRatingBarChangeListener监听器,用来监听RatingBar的分值变化。
    privateOnRatingBarChangeListenerlistener=newOnRatingBarChangeListener(){
    
     @Override
     publicvoidonRatingChanged(RatingBarratingBar,floatrating,
     booleanfromUser){
    
     r1.setRating(rating);
     r2.setRating(rating);
    
     }
     };
    25.Menu:在android中,我们可以界面添加菜单,那如何添加呢,就像home界面menu?
    为此我们需要重写Activity的onCreateOptionsMenu(Menumenu),为menu添加单菜
    事件处理:
    需要重写Acitiviy的onOptionsItemSelected,通过itemId来判断单击是哪一项。
    26.在android中,如何开发出一个对话框呢,例如,让用户单击确定或取消,或输入用户名和密码或者以菜单的方式让用户选择,为此android提供了AlertDialog.Builder;
    1)确定取消型
    2)自定义布局型
    3)菜单型
    27.文本框和编辑框属性
    使用pdf讲解
    28.样式表(风格)和主题
    风格:是一个属性的集合,它主要用于单个组件上,是为了让多个组件风格一致,才定义风格,同时系统也提供了一些风格,我们可以继承于它
    主题:是一个属性的集合,但它主要用于一个应用程序的所有Activity或单个Acitivty上.
    同时提供了很多主题,一般情况不更改系统主题,也继承于系统提供的主题。
    样式表定义方式:
    
     #FF00FF
     @android:style/TextAppearance.Large
    
    主题定义方式:
    
    #FFFF0F
    20px
    #FFFFFF在注册文件manifest.xml里面加android:theme="@style/UITheme"
    
    29.数据存储
    1)文件存储
    1.1内存和外存(实现文件显示、添加、删除,显示文件内容,对内容进行增删改查)
    1)Filefile=getFilesDir();//能过该方法得到手机内存的文件
    filesPath=file.getAbsolutePath();//得到绝对路径
    Filesd=Environment.getExternalStorageDirectory();//得到外存文件
    sdFilesPath=sd.getAbsolutePath();//得到外存路径
    2)把其中一个路径传递到第一个Activity,显示其列表
    3)通过menu,转向另一个Acitivty实现向该中径添加文件,调用finish()
    4)通过onActivityResult返回重新显示
    5)通过Filef=newFile(path+File.separator+list.get(position));
     f.delete();实现删除文件
    
    2)数据库存储(学会基本语法,显示记录,删除记录,修改记录)
    2.1SQLite简介
    在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
    2.2SQLite的SQLiteDatabase类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。
    2.3在Android系统,为我们提供了一个名为SQLi
    teOpenHelper的类,该类用于对数据库版本进行管理,该类是一个抽象类,必须继承它才能使用。为了实现对数据库版本进行管理,SQLiteOpenHelper类有两种重要的方法,分别是onCreate(SQLiteDatabasedb)和onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion),
    SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的
    2.4事务
    使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction()方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction()方法之前使用setTransactionSuccessful()方法设置事务的标志为成功,如果不调用setTransactionSuccessful()方法,默认会回滚事务。
    2.5支持分页查询
    31.意图与意图过滤器
    显式意图
    以前,咱经常使用显式意思,就是在发送意图时,用是组件信息
    隐式意图
    在发送意图时,不写组件信息,而让android根据action,category,data来找合适的activity或service或广播接收器
    android.intent.category.DEFAULT
    32.下载
    在网络上提供一个路径,通过以下三步,获取资源的input流,然后把输入流转化成字符串或写到某个存储器上。
    URLurl=newURL(path);
     HttpURLConnectionurlCon=(HttpURLConnection)url.openConnection();
     InputStreamin=urlCon.getInputStream();
    33.解析xml
    33.1SAX介绍:它是SimpleAPIXML的简称,它是用来解析xml的一种工具,能够把xml的信息以逐行的方式,把xml的内容解析出来,它优点是能够解析占空间较大xml,缺点是更改文档结构不方便
    33.2所使用的类
    SAXParserFactory->创建SAXParser->创建XMLReader->通过事件传XmlContentHandler->解析xml(事件驱动,每开始一个节点,会调用一个处理器的一个方法)
    
    例如:
    SAXParserFactorysf=SAXParserFactory.newInstance();
     XMLReaderxr=sf.newSAXParser().getXMLReader();
     XmlContentHandlerch=newXmlContentHandler();
     xr.setContentHandler(ch);//在处理器的开始元素实例化map,在charachter方法中把值装入map,在结束标签中,把map装入List中
     xr.parse(newInputSource(newStringReader(xml)));//xml字符串
    
    ch.getMap()//获取解析出来的信息
    
    dom解析:
    它是把整个xml文件放入内存中,它把整个文档组结点方式,然后
    可以方便对结点操作,包括取值,及添加删除。
    Stringxml="1001
    a.3gp42095
    
1002a.mp3
    3.08M
";
    作业:实现先下载、再解析并显示列表,当单击某个选项时,把值发送到主界面
    利用文件存储的编程模式,实现数据库的增删改查
    34.MediaPlayer
    播放器的状态
    reset(处于空闲状态)->setDatasurce()(初始化状态)->prepare()(处于准备状态)->处于播放状态->完成状态
    从播放可以到暂停,也可以到停止,暂停可以直接到播放,但是停止不能直接到播放,它必须先准备再播放。
    播放:调用service的startPlay方法,在方法内实现下载,设置数据源,准备,播放,判断地址是否为空,以免重复下载
    暂停:调用pause方法
    重新播放:调用seekTo(0)方法
    停止:调用stop方法,播放时,要重新准备,再播放
    35.实现在线听音乐
    实现音乐的播放、暂停、重新播放、停止、进度跟踪及快进,可以从网上下载音乐,并形成列表,选择其中之一进行播放。
    实现方案:显示音乐播放主界面->通过菜单导向音乐库(用tab做的布局)->显示音乐(网络解析并显示成列表)->选择音乐->让音乐播放器播放选择的音乐->完成暂停->完成下一首或上一首->完成进度条跟踪(使用一个循环和handler处理,seek快进与快退)->完成列表->循环播放->随机播放->显示播放音乐的列表。
    android高级
    1.socket
    介绍:socket是java的不同程序之间共享数据的一种手段,我们可以在客户端向服务器端发送数据。
    1.1服务端:
    我们可以实例化一个服务socket,来时刻监听别的程序来访,8888为服务所监听的端口。
    ServerSockets=newServerSocket(8888);
    当有程序访问时,Socketss=s.accept();将会创建一个Scocke对象。
    这个服务和客户就可以通过这个ss实现服务器端接收或发送数据。通常,我们把它传递给一个单独的线程,来处理这个请求:
    nputStreamin=ss.getInputStream();
    DataInputStreamdata=newDataInputStream(in);
    Stringstr=data.readUTF();
    OutputStreamout=ss.getOutputStream();
    DataOutputStreamdout=newDataOutputStream(out);
    处理完请求,关闭资源
    in.close(),out.close();s.close();
    1.2客户端
    客户端可以通过Socke来发送数据和接收数据:
    Socketsc=newSocket("10.0.2.2",8888);
    OutputStreamout=sc.getOutputStream();
    DataOutputStreamdout=newDataOutputStream(out);
    dout.writeUTF(data);
    InputStreamin=sc.getInputStream();
    DataInputStreamdin=newDataInputStream(in);
    Stringst=din.readUTF();
    2.通过http来请求网络资源:在android中,
    我们可以通过http协议来访问web资源如jsp,那么如何做到访问jsp呢?
    第一步,实例化HttpPosth=newHttpPost("10.0.2.2:8080/mp3/index.jsp");
    第二步,发送请求:
    DefaultHttpClientd=newDefaultHttpClient();
     HttpResponseres=d.execute(post);
    第三步,得到相应返回值(做一判断:res.getStatusLine().getStatusCode()==200表示成功)
    HttpEntityen=res.getEntity();
    第四步,把实体转化成字符串
    Stringresult=EntityUtils.toString(en);
    结束,得到返回值
    注:如何想往服务器传递值的话,需要创建Listparam=newArrayList();
    把参数封装到BaicNameValuePair中,并其装到param中
    BasicNameValuePairb=newBasicNameValuePair("name",editText1.getText().toString());
    param.add(b);
    UrlEncodedFormEntityu=newUrlEncodedFormEntity(param,HTTP.UTF_8)//把它转化成表单对象
    post.setEntity(u);
    通过get方法传值:改为HttpGet就可以了,同时不用传值。
    3.使用WebView进行网络开发:在android中,如何自己实现一个浏览网页的界面呢,为此android提供了WebView组件,此组件可通过webview.loadUrl();实现显示网页;
    实现步骤:
    1)创建一个布局,两个按钮分别实现前进后退还有一个按钮实现调用webview.loadUrl(url),一个编辑框,实现输入网址,最后加上WebView.
    2)在oncreate方法中,获取webview对象和三个按钮及一个EditText,在go的单击事件中,调用webview.loadUrl(url),在前进的单击事件中,调用webview的goForward(),在后退事件调用webview的goBack方法
    3)为webview添加wv.setWebViewClient(newWebViewClient(){});并实现它的onReceivedError方法。
    注:
    4)添加网页进度条getWindow().requestFeature(Window.FEATURE_PROGRESS);//显示网页加载的进度条
     wv.setWebChromeClient(newWebChromeClient(){//设置进度条
     @Override
     publicvoidonProgressChanged(WebViewview,intnewProgress){
     //TODOAuto-generatedmethodstub
     setProgress(100*newProgress);
     super.onProgressChanged(view,newProgress);
     }
     });
     //URLUtil.isHttpUrl(url)判断是否是一个httpurl
    webview.loadData(str,"text/html",HTTP.UTF_8);可以显示html语言
    4.短信控制:
    在开发中,会经常遇到发送短信,那么在android中,如何实现呢?这里主要涉及2个类
    SmsManager短消息管理类,主要是用于发送信息;
    PendingIntent:主要用于短消息发送之后,系统会自动执行它包装的意图。
    SmsManagersms=SmsManager.getDefault();
     Intentintent=newIntent();
     PendingIntentp=PendingIntent.getBroadcast(this,0,intent,0);
     sms.sendTextMessage("15555215554","5554","aaaaa",p,null);
     Toast.makeText(this,"发送成功",Toast.LENGTH_LONG).show();
    注:学生自行完成添加界面,发短信息
    权限
    :android.permission.SEND_SMS
    5.短信的接收:在android中,使用创建BroadcastReceiver的方式来接收短信,系统当收到短信息时,会发布广播,在我们的广播接收器中,可以接收短信息:
    短信内容和发送者是从onreceive方法的Intent中获取,系统会把信息以Bundle的方式存到,intent中,只我们调用Bundlebundle=arg1.getExtras();就可以获取了。
    但是,bundle中存的是对象数组,每个数组对象是一条短消息。因此我们要把数组中每个对象转化成SmsMessage对象。
    Bundlebundle=arg1.getExtras();
     if(bundle!=null)
     {
     Objectobj[]=(Object[])bundle.get("pdus");
     intlen=obj.length;
     SmsMessage[]sm=newSmsMessage[len];
     for(inti=0;i     {
     sm[i]=SmsMessage.createFromPdu((byte[])obj[i]);
     }
     StringBuilderb=newStringBuilder();
     for(SmsMessages:sm)
     {
     b.append("短信来自:");
     b.append(s.getOriginatingAddress());
     b.append("内容:");
     b.append(s.getDisplayMessageBody());
    
    
     }
     Toast.makeText(arg0,b.toString(),Toast.LENGTH_LONG).show();
    
    广播行为过滤:android.provider.Telephony.SMS_RECEIVED
    权限:android.permission.RECEIVE_SMS
    
    6.短信群发
    6.1访问联系人信息:在开发中,会经常查询联系人电话及其它信息,那么在android中如何访问联系人信息呢?为此android提供了一个managedQuery()方法
    managedQuery(Uri.parse("content://contacts/people"),newString[]{PhoneLookup.DISPLAY_NAME,PhoneLookup._ID},null,null,People.DEFAULT_SORT_ORDER);
    该方法返回联系人的和id,注意在此路径下没有电话信息,它的电话信息需要根据联系人的编号进行查询
    Cursorcc=managedQuery(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,newString[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.NUMBER},ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?",newString[]{id},null);
    把信息显示到ListActivity中,以备群发信息。
    6.2信息群发
    在短信界面,输入信息内容,通过菜单选择单发或群发,然后转向联系人列表,在那里选择发送人,如果是群发,不finish(),否则发过之后,finish转向,信息发送页面。
    7.信息状态的判定
    发送短信息之后,通常要得出短信的状态,可以提示用户重发,当发过信息之后,系统会自动执行PendingIntent所包装的对象,而它封装的是一个广播,所以我们可以注册一个广播,去处理这个广播,在onreceive方法中,如果发送成功,当前Activity的RESULTCODE的值是RESULT_OK,当失败时,它的结果码值SmsManager.RESULT_ERROR_GENERIC_FAILURE,提示用户重发送
    switch(getResultCode()){
    caseRESULT_OK:
    Toast.makeText(SmsActivity.this,"发送成功",Toast.LENGTH_LONG).show();
    break;
    caseSmsManager.RESULT_ERROR_GENERIC_FAILURE:
    Toast.makeText(SmsActivity.this,"请重新发
    送",Toast.LENGTH_LONG).show();
    8.拨电话
    8.1selector选择器
    当想更改控件的系统默认图片时,我们可以自定义selector,在android的platforms\android-8\data\res\drawable中,有很多定义好的selector,我们可以参照它,来定义我们的控件背景,如果按钮按下和抬起时的图片
    
    
        android:state_pressed="true"
    android:drawable="@drawable/del"/>
        android:state_pressed="false"
    android:drawable="@drawable/deldown"/>
    
    它的使用:
    
    完成电话拨打界面,删除数字,数字键,拨打电话
    8.2拨打电话:系统提供了一个电话拨号程序,我们可以通过隐式意图来访问它。
    Intentin=newIntent(Intent.ACTION_CALL);
     in.setData(Uri.parse("tel://"+txtNum.getText()));
     startActivity(in);
    
    8.3监听电话状态,当不想听到不喜欢的电话时,我们可以监听电话的状态,我们可以在状态中,把电话静音或调为振动状态。
    TelephonyManager.CALL_STATE_OFFHOOK通话状态
    TelephonyManager.CALL_STATE_RINGING铃声状态
    TelephonyManager.CALL_STATE_IDLE空闲状态
    为监听状态,必须为TelephonyManager添加监听器类
    TelephonyManagertp=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
     tp.listen(newmyphone(),myphone.LISTEN_CALL_STATE);
    同时创建状态监听器类
    privateclassmyphoneextendsPhoneStateListener{
    publicvoidonCallStateChanged(intstate,StringincomingNumber){
    }
    }
    权限:
    
    9.邮件发送
    在android中,发送邮件的项主要包括,发往目的地址(Email),抄送(副本CC),主题(subject),内容(Text),把这几个项以Intent提供的key来传值,最调用startActivity(Intent.createChooser(intent,"标题"));//待查
    Intentin=newIntent(Intent.ACTION_SEND);
     in.setType("plain/text");
     in.putExtra(Intent.EXTRA_EMAIL,newString[]{txt1.getText().toString()});
     in.putExtra(Intent.EXTRA_CC,newString[]{txt2.getText().toString()});
     in.putExtra(Intent.EXTRA_SUBJECT,txt3.getText().toString());
     in.putExtra(Intent.EXTRA_TEXT,txt3.getText().toString());
     startActivity(Intent.createChooser(in,"邮件"));
    10.传感器的应用开发
    10.1配置传感器环境:
    因为模拟器本身不能像手机一样进行运行,感应真实世界,所以,我们可以安装一个环境来模拟真实世界。
    步骤
    1.下载sensorsimulator-1.1.0-rc1.zip,并把它解压到c根目录下。
    2.cmd下进入C:\sensorsimulator-1.1.0-rc1\sensorsimulator-1.1.0-rc1\bin并执行命令
    adbinstallSensorSimulatorSettings-1.1.0
    -rc1.apk
    3.启动bin下sensorsimulator-1.1.0-rc1.jar
    4.配置安装程序,从启动器打开安装传感器程序,并配置它,ip地址输入10.0.2.2,端口不变
    5.执行testing->connect
    6.改变sensorsimulator-1.1.0-rc1.jar中的图像,如果模拟器的加速器发生变化表示安装成功
    10.2加速度传感器
    加速度传感器是用来感应手机的运动的,它主要捕获三个参数,x,y,z坐标,x表示手机底部的线,它的值是该方向的加速度减去该方向重力加速度分量。
    y表示高度的线,它值是该方向的加速度减去重力加速度,z是与手机屏幕垂直方向的线,它的值也该方向加速度减去该方向重力加速度分量。
    如何获取三个方向分量的值呢?
    1)创建传感器管理类对象
    sensor=SensorManagerSimulator.getSystemService(this,SENSOR_SERVICE);
    sensor.connectSimulator();
    2)在onresume里注册传感器监听器
     protectedvoidonResume()
     {
    //第一个参数表示监听器,第二个参数表传感器对象,第三个参数(待查)
     sensor.registerListener(sl,sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManagerSimulator.SENSOR_DELAY_FASTEST);
     super.onResume();
    
     };
    
    3)创建监听器
    实现SensorEventListener接口
    
    11.当系统设置发生变化时,会影响到程序的运行,所以,当系统设置发生变化时,我们的Activity需要被通知,那么如何实现这个需求呢?
    11.1Configuration类介绍,此类中存储系统的配置信息,如屏幕方向、导航方式、键盘类型、触屏方式等信息。
    11.2当信息发生更改时,我有可能需要知道它的变化,要想知道变化,那么我们可以在Activity中重写publicvoidonConfigurationChanged(ConfigurationnewConfig)方法,此方法会在系统设置发生变化时,会被调用。
    注:在menifest.xml中需要配置响应更改属性android:configChanges="orientation",同时,设置权限android.permission.CHANGE_CONFIGURATION
    示例:在主界面中做两个按钮,一个更改方向的,一个是取方向值的。在onConfigurationChanged中调用getRequestedOrientation()获取方向。
    publicvoidonConfigurationChanged(
     android.content.res.ConfigurationnewConfig){
     switch(newConfig.orientation){
     caseActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
     Toast.makeText(EmaileAcitity.this,"纵向",Toast.LENGTH_LONG).show();
     break;
     caseActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
     Toast.makeText(EmaileAcitity.this,"横向",Toast.LENGTH_LONG).show();
     break;
     }
     super.onConfigurationChanged(newConfig);
     }
    12.设置壁纸
    如何更改手机背景图片呢,为此我们可以在单击事件中,调用setWallpaper(in);
    恢复默认调用clearWallpaper();
    
    13.手机振动设置
    手机振动可以
    做来电提醒,在应用程序中恰当使用振动可以收到更好的效果,如果游戏中玩家失败一次,可以振动一次,在android中,要想振动,可以通过Vibrator对象,为了获取其对象,我样可以通过
    vibr=(Vibrator)getSystemService(VIBRATOR_SERVICE);获取振动对象
    然后通过调用vibr.vibrate()方法实现振动,
    vibrate()第一个参数待查,第二个参数待查
    vibrate(2000)表示振动持续2000毫秒
    14.音量调节:当播放音乐时,需要调节音量大小,android提供了调节播放音乐声音大小方法,主要包括
    am.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);//此方法是用来放大音乐大小,第一个参数表示你所放大音乐大小的类型,在这里是music,第二表示是放大或缩小,第三大放大声音或缩小声音时,是显示界面或只有声音,或是振动模式
    am.setStreamMute(AudioManager.STREAM_MUSIC,true);//表示是否静音,第一个参数是所静音的声音类型,第二表示是否静音。
    要使用,我们可以通过am=(AudioManager)getSystemService(AUDIO_SERVICE);获取一个管理声音的一个对象。
    15.TelephonyManager类
    简介:它位于android.telephony包下,主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法,其中包括手机SIM的状态和信息,电信网络及手机用户信息,在应用程序中,可以使用这些get方法获得相关数据。在获取需要添加权限。
    StringdeviceId=tm.getDeviceId();//设备编号
    Stringyunyingshnagid=tm.getNetworkOperator();//网络运营商编号
    Stringyunyingshnagname=tm.getNetworkOperatorName();//网络运营商
    Stringshe=tm.getCellLocation()+"";//获取设备当前位置
    Stringteltype=shou[tm.getPhoneType()];//手机制式(可以从文档中获得)
    Stringguobie=tm.getSimCountryIso();//sim国别
    Stringkaxulie=tm.getSimSerialNumber();//sim序列号
    Stringstate=simstate[tm.getSimState()];//sim卡状态(可以从文档中获得)
    示例:可以定义一个ListActivity,在list中存储所有以上获取的信息,用数组存储每个字段的含义如:设备编号,网络运营商编号等,然后把他放到自定义的适配器中。
    16.获取电量
    在开发经常会获取系统电量,那么如何获取呢?
    我们可以通过一个广播接收器,来接收系统的电量的变化,
    publicvoidonReceive(Contextcontext,Intentintent)
    {
    
     intlevel=intent.getExtras().getInt("level");
     intscale=intent.getExtras().getInt("scale");
     txtBattery.setText(level*100/scale+"%");
    }
    我们可以在ToggleButton的OnCheckedChangeListener事件中,注册此广播接收器,然后当关闭时,取消注册。
    17.设置闹钟,如何做到在某个时刻启动某个一个Activity,在此Acti
    vity中提示时间到了。
    为此android提供了AlarmManager,此类能够执行某个时刻执行我们意图,在意图实现转向。
    AlarmManageram;
    Calendarc=Calendar.getInstance();
    c.setTimeInMillis(System.currentTimeMillis());
    c.set(Calendar.HOUR_OF_DAY,hourOfDay);
    c.set(Calendar.MINUTE,minute);
    c.set(Calendar.SECOND,0);
    c.set(Calendar.MILLISECOND,0);
    Intentinn=newIntent("com.alarm");
    PendingIntentin=PendingIntent.getBroadcast(AlarmActivity.this,4,inn,PendingIntent.FLAG_UPDATE_CURRENT);
    am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),in);
    TimePickerDialogt=newTimePickerDialog(AlarmActivity.this,newTimePickerDialog.OnTimeSetListener(),cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE),false)用来显示时间对话框,可以选定时。
    18.快捷方式
    如何使用程序,在你的应用程序中,为其创建快捷方式,并把图标显示到桌面上呢?
    为此需要发送个广播,这个广播意图的行为一定要是com.android.launcher.action.INSTALL_SHORTCUT,并且需要把快捷方式的名称和图片及此快捷方式需要转向的意图赋给广播意图:
    Intentin=newIntent("com.android.launcher.action.INSTALL_SHORTCUT");//广播意图
     Parcelablep=Intent.ShortcutIconResource.fromContext(AlarmActivity.this,R.drawable.icon);//加载快捷方式图片
     Intentinn=newIntent//单快捷转向的意图(AlarmActivity.this,AlarmActivity.class);
     in.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,p);//把图片存入意图中
     in.putExtra(Intent.EXTRA_SHORTCUT_NAME,"时钟");//把标题存入意图
     in.putExtra(Intent.EXTRA_SHORTCUT_INTENT,inn);//快捷方式意图
     sendBroadcast(in);//广播意图
    注意权限:
    19.录音
    在android中,如何做到通过mic进行录音呢?
    为此android提供了MediaRecorder类,此类能够实现录音操作
    可以一个按钮的单击事件这么写:
    Filefile=File.createTempFile("yin",".mp3");
    path=file.getAbsolutePath();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//数据源从mic
    recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//输出格式黙认
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//编码默认
    recorder.setOutputFile(file.getAbsolutePath());//音频的输出路径
    recorder.prepare();//准备
    recorder.start();//开始录音
    在另外一个按钮单击事件这么写:
    recorder.stop();//停止
    recorder.reset();//空闲
    //recorder.release();
    看状态
    MediaRecorder
    20.视频播放
    为播放视频,我们需要两个类
    mc=newMediaController(this);
    vv=(VideoView)findViewById(R.id.VideoView01);
    vv.setMediaController(mc);//控件器赋值给视图
    mc.setAnchorView(vv);//把视图赋值控制器
    vv.setVideoURI(Uri.parse("/sdcard/a.mp3"));
    vv.start();
    21.摄像
    在android中,实现摄像需要经过以下4个步
    骤
    1.获取摄像头对象,并通过摄像头对象得到控制摄像头的SurfaceHolder对象,设置图片缓存类型
    surView=(SurfaceView)findViewById(R.id.SurfaceView01);
    holder=surView.getHolder();//获取操作摄像头的holder对象
    holder.setType
    (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置内存类型
    2.设置照像机的浏览视图
    在此过程需要打开(创建)Camera对象,同时为像机设置参数,并把摄像头对象的holder告诉像机,至此可以启动浏览了
    if(!isPreview)//是否打开浏览视图了
     {
     //创建camera对象
     camera=Camera.open();
     }
     if(camera!=null&;&;!isPreview)
     {
     try
     {
     //获取设置camera对象的参数
     Parametersp=camera.getParameters();
     p.setPictureFormat(PixelFormat.JPEG);//图像格式
     p.setPictureSize(320,240);//图片大小
     p.setPreviewSize(320,240);//预览视图大小
     camera.setParameters(p);//把参数设置给像机
     camera.setPreviewDisplay(holder);//把holder设置给像机,让像机操作摄像头
     camera.startPreview(); //启动预览
     isPreview=true;//标志启动预览
     }
     catch(Exceptione)
     {
     e.printStackTrace();
     }
     }
    3.拍摄图像
    需要调用照像机的方法camera.takePicture(sc,pc,jpeg);
    第一个参数实现ShutterCallback的对象
    第二个参数实现privatePictureCallbackpc=newPictureCallback()对象
    第三参数实现privatePictureCallbackpc1=newPictureCallback(),
    当拍摄完图片之后,会自动调用pc1.onPictureTaken(byte[]data,Cameracamera)方法
    在该方法中,把图片字节数组data写入sd卡.
    Bitmapbit=BitmapFactory.decodeByteArray(data,0,data.length);
    
     try
     {
     FileOutputStreamout=newFileOutputStream(newFile("/sdcard/123.jpg"));
     BufferedOutputStreambou=newBufferedOutputStream(out);
     bitpress(Bitmap.CompressFormat.JPEG,80,bou);
     bou.flush();
     bou.close();
     imgView.setImageBitmap(bit);
     resetCamera();
     initCamra();
     }
     catch(Exceptione)
     {
     //TODOAuto-generatedcatchblock
     e.printStackTrace();
     }
    4.停止
    需要停止照相机。
    if(camera!=null&;&;isPreview)
     {
     camera.stopPreview();//停止预览
     camera.release();//释放
     isPreview=false;
    
     }
    
    5.查找一下Callback对象
    22.
    image=(ImageView)this.findViewById(R.id.ImageView01);
     Filefile=getFilesDir();//获得内存的文件地址data/data/com.socket/files
     //Environment.getExternalStorageDirectory();获得sdcard的根目录
     Bitmapbitmap=BitmapFactory.decodeFile(file.getAbsolutePath()+"/"+"1.png");
     image.setImageBitmap(bitmap);
    
    
    
    
    
    
  • 上一篇资讯: Android 音乐播放器设计
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号