




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章Service与广播机制1757.1Service简介175l 请写出Service的四个特点。答案:没有用户界面。比Activity 的优先级高,不会轻易被Android系统终止。即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态。可用于进程间通信(Inter Process Communication,IPC),解决两个不同Android应用程序进程之间的调用和通讯问题。7.2Service的两种使用方式176l Service的使用方式有哪几种?答案:Android中,Service有两种不同的使用方式,一种是以启动方式使用Service(Started Service),另一种是以绑定方式使用Service(Bound Service)。7.3以启动方式使用Service1767.3.1生命周期1767.3.2实现自己的Service类1777.3.3启动Service1787.3.4停止Service179l 请简单描述被启动的Service的onCreate()、onStart()和onDestroy()这三个生命周期关键点。答案:onCreate()事件回调函数: Service的生命周期开始,完成Service的初始化工作。onStart()事件回调函数:活动生命周期开始,但没有与之对应的“停止”函数,因此可以近似认为活动生命周期也是以onDestroy()标志结束。onDestroy()事件回调函数: Service的生命周期结束,释放Service所有占用的资源。7.4以绑定方式使用Service1797.4.1生命周期1797.4.2实现自己的Service类1807.4.3绑定Service1807.4.4解绑Service181l 请描述绑定式Service的五个特点。答案:通过服务链接(Connection)或直接获取Service中状态和数据信息。服务链接能够获取到Service对象,因此绑定Service的组件可以调用在Service中实现的函数。使用Service的组件通过Context.bindService()建立服务链接,通过Context.unbindService()停止服务链接。如果在绑定过程中Service没有启动,Context.bindService()会自动启动Service。同一个Service可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务。7.5两种Service的选择181l 请描述两种Service的选择?答案:以启动方式使用Service时,使用startService()方法的目的是回调onStart()方法,onCreate() 方法是在Service不存在的时候调用的,如果Service存在,那么startService()将跳过onCreate() 方法,例如之前调用了bindService,那么Service的onCreate方法已经调用了。以绑定方式使用Service时,使用bindService()方法的目的是回调onBind()方法,它的作用是在Service和调用者之间建立一个桥梁,当调用者结束时,Service也会结束,而不负责更多的工作,例如一个连接服务器的操作。综上,一般会把要在应用程序被关闭后仍然需要执行的操作实现为一个启动式的Service,而将一些执行特定功能、执行周期短或在应用程序关闭后将要停止的操作实现为绑定式的Service。l 如何启用Service,如何停用Service。答案:Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:第一步:继承Service类publicclassSMSServiceextendsService第二步:在AndroidManifest.xml文件中的节点里对服务进行配置:服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-onDestroy()方法。服务常用生命周期回调方法如下:onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。onDestroy()该方法在服务被终止时调用。与采用Context.startService()方法启动服务有关的生命周期方法onStart()只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart()方法会被多次调用。与采用Context.bindService()方法启动服务有关的生命周期方法onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用javaview plaincopyprint?采用Context.bindService()方法启动服务的代码如下:publicclassHelloActivityextendsActivityServiceConnectionconn=newServiceConnection()publicvoidonServiceConnected(ComponentNamename,IBinderservice)publicvoidonServiceDisconnected(ComponentNamename);OverridepublicvoidonCreate(BundlesavedInstanceState)Buttonbutton=(Button)this.findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener()publicvoidonClick(Viewv)Intentintent=newIntent(HelloActivity.this,SMSService.class);bindService(intent,conn,Context.BIND_AUTO_CREATE);/unbindService(conn);/解除绑定);7.6Android广播机制1827.6.1收发广播1827.6.2系统自带的广播1887.6.3广播的分类188l 请描述在注册BroadcastReceiver时,Android提供的两种方法。答案:在Java代码中调用registerReceiver()方法动态注册非常驻型BroadcastReceiver。在AndroidManifest.xml文件中使用标签静态注册常驻型BroadcastReceiver。7.6.4广播接收器的生命周期189l Service的最小代码集并不能完成任何实际的功能,需要重写onCreate()、onStart()和onDestroy()三个方法,才能使Service具有实际意义。请写出这三个方法的调用情况。答案:Android系统在创建Service时,会自动调用onCreate() 完成必要的初始化工作。在Service没有必要再存在时,系统会自动调用onDestroy(),释放所有占用的资源。通过Context.startService(Intent)启动Service时,onStart()则会被系统调用,Intent会传递给Service一些重要的参数。l 广播接收者生命周期。答案:一个广播接收者有一个回调方法:voidonReceive(ContextcurContext,IntentbroadcastMsg)。当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行这个方法时是活跃的。当onReceive()返回后,它是不活跃的。有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。l AIDL的全称是什么?如何工作?能处理哪些类型的数据?答案:AIDL全称AndroidInterfaceDefinitionLanguage(AndRoid接口描述语言)是一种借口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.如果要使用AIDL,需要完成2件事情:1.引入AIDL的相关类.;2.调用aidl产生的class.理论上,参数可以传递基本数据类型和String,还有就是Bundle的派生类,不过在Eclipse中,目前的ADT不支持Bundle做为参数,具体实现步骤如下:1、创建AIDL文件,在这个文件里面定义接口,该接口定义了可供客户端访问的方法和属性。2、编译AIDL文件,用Ant的话,可能需要手动,使用Eclipseplugin的话,可以根据adil文件自动生产java文件并编译,不需要人为介入.3、在Java文件中,实现AIDL中定义的接口.编译器会根据AIDL接口,产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.4、向客户端提供接口ITaskBinder,如果写的是service,扩展该Service并重载onBind()方法来返回一个实现上述接口的类的实例。5、在服务器端回调客户端的函数.前提是当客户端获取的IBinder接口的时候,要去注册回调函数,只有这样,服务器端才知道该调用那些函数AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。由于远程调用的需要,这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:1.不需要import声明的简单Java编程语言类型(int,boolean等)2.String,CharSequence不需要特殊声明3.List,Map和Parcelables类型,这些类型内所包含的数据成员也只能是简单数据类型,String等其他比支持的类型.(另外:我没尝试Parcelables,在Eclipse+ADT下编译不过,或许以后会有所支持).实现接口时有几个原则:.抛出的异常不要返回给调用者.跨进程抛异常处理是不可取的.IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。也就是IPC调用会挂起应用程序导致界面失去响应.这种情况应该考虑单起一个线程来处理.不能在AIDL接口中声明静态属性。IPC的调用步骤:1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。2.实现ServiceConnection。3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.4.在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).调用YourInterfaceName.Stub.asInterface(IBinder)service)将参数转换为YourInterface类型。5.调用接口中定义的方法。你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。6.断开连接,调用接口实例中的ApplicationContext.unbindService()参考:/399160/372090l 谈谈对AndroidNDK的理解。答案:NDK全称:NativeDevelopmentKit2.误解误解一:NDK发布之前,Android不支持进行C开发在Google中搜索“NDK”,很多“Android终于可以使用C+开发”之类的标题,这是一种对Android平台编程方式的误解.其实,Android平台从诞生起,就已经支持C.C+开发.众所周知,Android的SDK基于Java实现,这意味着基于AndroidSDK进行开发的第三方应用都必须使用Java语言.但这并不等同于“第三方应用只能使用Java”.在AndroidSDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的.当然这种误解的产生是有根源的:在AndroidSDK文档里,找不到任何JNI方面的帮助.即使第三方应用开发者使用JNI完成了自己的C动态链接库(so)开发,但是so如何和应用程序一起打包成apk并发布?这里面也存在技术障碍.我曾经花了不少时间,安装交叉编译器创建so,并通过asset(资源)方式,实现捆绑so发布.但这种方式只能属于取巧的方式,并非官方支持.所以,在NDK出来之前,我们将“Java+C”的开发模式称之为灰色模式,即官方既不声明“支持这种方式”,也不声明“不支持这种方式”.误解二:有了NDK,我们可以使用纯C开发Android应用AndroidSDK采用Java语言发布,把众多的C开发人员排除在第三方应用开发外(注意:我们所有讨论都是基于“第三方应用开发”,Android系统基于Linux,系统级别的开发肯定是支持C语言的.).NDK的发布,许多人会误以为,类似于Symbian.WM,在Android平台上终于可以使用纯C.C+开发第三方应用了!其实不然,NDK文档明确说明:itisnotagoodway.因为NDK并没有提供各种系统事件处理支持,也没有提供应用程序生命周期维护.此外,在本次发布的NDK中,应用程序UI方面的API也没有提供.至少目前来说,使用纯C.C+开发一个完整应用的条件还不完备.1.NDK是一系列工具的集合
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动仲裁签协议书劳动关系仲裁书(13篇)
- 2025年事业单位工勤技能-湖南-湖南公路养护工一级(高级技师)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖北-湖北家禽饲养员二级(技师)历年参考题库典型考点含答案解析
- 2025-2030中国线上超市行业经营效益与未来运营模式分析报告
- 医疗与医药行业:医疗信息化在智慧医疗建设中的应用报告
- 2025年事业单位工勤技能-浙江-浙江工程测量员二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南热处理工五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南图书资料员四级(中级工)历年参考题库典型考点含答案解析
- 2024版出租果树合同范本
- 2024-2025年度上海市设备监理师之设备监理合同题库与答案
- 多媒体教室使用的课件
- 2025年军队专业技能岗位文职人员招聘考试(工程机械驾驶员)历年参考题库含答案详解(5卷)
- 2025年下半年广西现代物流集团社会招聘校园招聘笔试参考题库附带答案详解(10套)
- 2025年粉笔辅警考试题库
- 水声传感器技术研究与应用
- 2025年小学教研室教学计划
- 2025年上海市建筑工程施工合同模板
- 手术室护理业务学习
- 贩卖人口罪与强迫劳动罪
- 新员工入职职业道德培训
- 宽带宣传活动方案
评论
0/150
提交评论