四大组件及声明周期.docx_第1页
四大组件及声明周期.docx_第2页
四大组件及声明周期.docx_第3页
四大组件及声明周期.docx_第4页
四大组件及声明周期.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android内容总结1.android四大组件:activity、service服务、contentprovider内容提供者、BroadCastReciver广播接收器。Activity:应用程序中,一个activity通常就是一个独立的屏幕,上面可以显示一些控件也可以监听并处理用户的事件做出相应。Activity之间使用intent通信。在intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。典型的动作类型有:main(activity门户)、pick、edit、view等。而动作对应的数据以url的形式表示。例如:要查看一个人的联系方式,你需要创建一个动作类型为VIEW的intent,以及一个表示这个人的URI。与之有关系的一个类:intentfilter。相对于intent是一个有效的做某事的请求,一个intentfilter则用于描述一个activity或者intentreceiver能够操作那些intent。一个activity如果要显示一个人的联系方式时,需要声明一个intentfilter,这个intentfilter要知道怎么去处理view动作和表示一个人的url。Intentfilter需要在androidmanifest.xml中定义。通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity会调用startactivity(intentmyintent),然后,系统会在所有安装的应用程序中定义的intentfilter中查找,找到最匹配的myintent的intent对应的activity。新的activity家收到myintent的通知后,开始运行。当startactivity方法被调用将触发解析myintent的动作,这个机制提供了两个关键好处:Activitys能够重复利用从其他组件中以intent的形式产生的请求。Activitys可以在任何时候被一个具有相同intentfilter的新activity取代配置启动项的activityBroadCastReceiver广播接收器:应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如电话呼入时,数据网络可用时)进行接收并作出响应。广播接收器没有用户界面。可以在启动activity或者service来响应它们接收到的信息,或者使用notificationmanager来通知用户。通知可以用很多种方式来吸引用户的注意力闪动背灯、震动等。一般来说,闪在状态栏中放上一个持久的图标,用可以打开它并获取消息。广播类型:普通广播,通过Context.sendBroadcast(intentmyintent)发送的有序广播:通过Context.sendOrderedBroadcast(intent,receiverpermissin)发送的。第二个参数决定该广播的级别,-1000到1000之间,值越大,发送的优先级越高;广播接受者接受广播时的级别可通过intentfilter中的priority进行设置为2147483647时优先级最高,同级别的接收的先后是随机的,在到级别低的收到广播,高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其它的接受者无法收到该广播,还有其他构造函数。异步广播:通过Context.sendStickyBroadcast(intentmyintent)发送的,还有sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras)方法,该方法具有有序广播的特性也有异步广播的特性;发送异步广播要:权限,接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉。注:发送广播时的intent参数与context.startactivity()启动时的intent不同,前者可以被多个订阅它的广播接收器调用,后者只能被activity或service调用。监听广播intent步骤:1、写一个继承broadcastreceiver的类,重写onreceive()方法,广播接收器仅在它执行这个方法时处于活动状态,当onreceive()返回后,即为失活状态。为了保证用户交互过程的流畅,一些费时操作要放到线程中2、注册广播接收者,有动态注册和静态注册静态注册:动态注册,一般在Activity可交互时onResume()内注册BroadcastReceiverIntentFilterintentFilter=newIntentFilter(vider.Telephony.SMS_RECEIV;registerReceiver(mBatteryInfoReceiver,intentFilter);/反注册unregisterReceiver(receiver);生命周期只有十秒左右,如果在onreceive()内做超出十秒内的事情,就会报anr(applicationnoresponse)程序无响应的错误信息,如果需要完成一项比较耗时的工作,应该通过发送intent给service,由service来完成,这里不能使用子线程来解决,因为broadcastreceiver的生命周期很短,子线程还没有结束broadcastreceiver就结束了。Broadcastreceiver一旦结束,此时broadcastreceiver的所在进程很容易在系统需要内存时被优先杀死,因为他属于空进程。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死,所以采用子线程来解决时不可靠的。动态注册广播接收器的一个特点:当用来注册的activity关掉后,广播也就失效了,静态注册无需担忧广播接收器是否被关闭,只要是设是开启状态。光比接收器也是打开着的。也就是说哪怕app本身未启动,该app在订阅的广播在触发时也会对他器作用系统常见广播intent:开机启动、电池电量变化、时间改变等广播Service服务:一个service时一段长生命周期的,没有用户界面的程序,可以用来开发如监控类的程序。Service使用步骤:1、继承service类2、在Androidmanifest.xml配置清单文件中节点中对服务进行配置服务不能自己运行,需要通过context.startservice()或者conext.bindservice()启动服务通过前者启动服务于调用者没有关系,即使调用者关闭了,服务器仍然像停止服务要调用context.stopservice()。此时系统会自动调用ondestory(),使用此方法启动时,服务首次启动系统先调用服务的oncreate()-onstart(),如果服务已经启动再次调用只会触发onstart()方法。使用后者启动服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-onDestory();Contentprovider内容提供者Android平台提供了contentprovider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个sqlite、或以任何其他合理的方式。其他应用可以通过ContentResolver类(ContentProviderAccessApp例子)从该内容提供者中获取或则存入数据。只有需要在多个应用程序间共享数据才需要内容提供者。好处:统一数据访问方式。Android系统自带的内容提供者,这些内容提供者在sdk文档中viderjava包中都有介绍。mediastore如:browser、calllog、contacts(groups、people、phones、photos)、images(thumbnails)、mediastore(albums、artists、audio、genres、playlists)、settings、videoCalllog:地址和接收到电话信息Contact.people.phones:存储电话信息Setting.system:系统设置和偏好设置使用contentprovider对外共享数据的步骤1、继承contentprovider类并根据需求重写方法2、在Androidmanifest.xml当中使用对contentprovider进行配置注册(内容提供者注册它自己就像网站注册域名),ContentProvider采用authoritie(原意授权,可理解为域名)作为唯一标识,方便其他应用能找到生命周期Android应用程序的生命周期是由android框架进行管理,而不是由应用程序直接控制。通常,每一个应用程序,都会产生一个进程。当系统内存即将不足的时候,会按照优先级自动进行进程的回收。不管是使用者和开发者,都无法确定应用程序何时会被回收。Activity生命周期四种状态,7个重要方法和三个嵌套循环1四种状态活动(Active/Running)状态当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity处于活动(Active)或运行(Running)状态暂停(Paused)状态当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。用户启动了Activity,正在运行,而且可见,但是一个通知或者其他的提示出现在屏幕的最上层,此时可以看到Activity但是不能和它交互。比如有电话进来,用户可以选择接听或者忽略;停止(Stopped)状态完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉。用户启动了Activity,正在运行,但是因为其他Activity的启动或者切换而隐藏。这时该activity不能直接操作,除了通过通知;非活动(Dead)状态Activity尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用finish方法。activity不在是启动的,比如电话做了重置(reset),或者activity被终止,比如因为内存不够了。如果是(按根据内存不足时的回收规则)被系统回收,可能是因为内存不足了内存不足时,Dalvak虚拟机会根据其内存回收规则来回收内存:1.先回收与其他Activity或Service/IntentReceiver无关的进程(即优先回收独立的Activity)因此建议,我们的一些(耗时)后台操作,最好是作成Service的形式2.不可见(处于Stopped状态的)Activity3.Service进程(除非真的没有内存可用时会被销毁)4.非活动的可见的(Paused状态的)Activity5.当前正在运行(Active/Running状态的)Activity27个重要方法,当Activity从一种状态进入另一状态时系统会自动调用下面相应的方android系统通过调用一些约定的activity方法,来转换activity的状态。onCreate()方法和onDestroy()方法onCreate()方法被调用的情况:1. 当activity第一次被创建的时候,带null参数;2. 如果activity已经运行过,后来被kill掉,将调用带Bundle参数的onCreate()方法,该参数来源于onSaveInstanceState()3. 当activity处于不同的设备状态时,比如从竖显到横显,将会调用onCreate()方法重建activityonDestroy被调用的情况,即当activity关闭的情况:1. activity执行了finish()方法2. android需要RAM,可能会紧急关闭activity需要注意的是,如果内存十分紧急,可能不会调用onDestroy方法,而是系统不顾一切的关闭掉,比如来电话的时候。onDestroy()通常用于释放在onCreate()方法中获得的资源。onStart()、onRestart()和onStop()方法activity在前台执行,可能因为是第一次启动,或者从隐藏状态重新带回前台(比如其他的activity或者来电话)。以上情况都会执行onStart()。onRestart()方法会在activity已经停止,重新开始的时候调用。onStop()方法在activity要停止的时候调用。onPause()和onResume()方法onResume()方法在activity要前台运行的时候执行,比如第一次初始启动后,或者从停止(stop)状态重新开始,或者当一个弹出对话框被清除(比如来电话)。这是刷新UI的最佳位置,可以在此方法中刷新视图,或者调用后台线程更新UI。相应的,当其他activity夺取了当前activity的控制权后,需要调用当前activity的onPause()方法。在此方法中,应该取消任何在onResume()方法中做的事情。比如关闭后台线程,释放任何独占方位的资源(比如摄像头)。一旦onPause()方法被调用,android系统将保留对此activity所在进程在任何时刻kill的权利。因此在此状态下不会可靠的收到将来的事件消息。对状态的合理处理一般情况下,上述方法会处理应用程序通用的事情。比如通过onCreate()方法关联出最后的UI,通过onPause()方法关闭后台线程。但有时需要为activity保存状态。比如有个计算器程序activity,计算结果后,可能又做了其他事情,用户回头想查刚才计算的结果。因为计算器有可能因为内存稀缺而关闭。这时需要使用onSaveInstanceState()方法,android会通过该方法保存状态,可以覆盖该方法保存自己的状态值到Bundle。然后通过onCreate()或者onRestoreInstanceState()方法得到Bundle对象实例恢复这些自定义状态。33个嵌套循环1.Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束2.Activity的可视生命周期:从调用onStart()到相应的调用onStop()在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop()中注销。3.Activity的前台生命周期:从调用onResume()到相应的调用onPause()。BroadcastReceive广播接收器生命周期:生命周期只有十秒左右,如果在onReceive()内做超过十秒内的事情,就会报ANR(ApplicationNoResponse)程序无响应的错误信息它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束Service生命周期Service完整的生命周期:从调用oncreate()开始直接到调用ondestory()结束Service有两种使用方法:1以调用Context.startService()启动,而以调用Context.stopService()结束2以调用Context.bindService()方法建立,以调用Context.unbindService()关闭service重要的生命周期方法当用户调用startService()或bindService()时,Service第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法,通常用于初始化设置。注意:多次调用startService()或bindService()方法不会多次触发onCreate()方法voidonCreate()当用户调用stopService()或unbindService()来停止服务时被系统调用,(整个生命周期只调用1次)用来释放onCreate()方法中创建的资源voidonDestroy()通过startService()方法启动的服务初始化结束后系统会调用该方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法voidonStart(Intentintent)通过bindService()方法启动的服务初始化结束后系统会调用该方法,用来绑定传递给bindService的Intent的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法IBinderonBind(Intentintent)用户调用unbindService()时系统调用此方法,Intent对象同样传递给该方法booleanonUnbind(Intentintent)如果有新的客户端连接至该服务,只有当旧的调用onUnbind()后,新的才会调用该方法voidonRebind(Intentintent)Activity应用表示层(基类Activity)应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的。同一应用中的每个Activity是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activity启动另一个新的Activity。Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序做交互)。Activity窗口内的可见内容通过基类View提供。使用Activity.setContentView()方法设置当前Activity中的View对象。每个View对象控制着窗口内的一个矩形空间;View是一种层次化结构,ParentView中的布局属性会被子View继承;位于View层次关系最底层的子View对象所代表的矩形空间就是跟用户进行交互的地方Activity状态回调:onCreateonStartonRestartonResumeonPauseonStoponDestroyService没有可见的用户界面,但能够长时间运行于后台(基类Service)运行于应用程序进程的主线程中,因此Service不会阻塞其他组件和用户界面。Service是不能自己启动的,必须通过Context对象(如一个Activity)调用startService或bindService方法来启动(用这两种方法启动的Service的生命周期不同)。1.调用startService方法a)若Service没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。b)若Service已经启动,则会直接调用onStart方法c)该方法启动的Service,可以通过Context对象调用stopService来关闭,也可以通过Service自身调用stopSelf()或stopSelfResult()来关闭,关闭之前调用onDestory方法。2.调用bindService方法,使当前Context对象通过一个ServiceConnection的对象绑定到所指定的Servicea)若Service没有启动,则首先会调用该Service的onCreate方法初始化启动,然后调用Service的onBind方法初始化绑定。b)如果绑定Service的Context对象被销毁时,被绑定的Service也会调用onUnbind和onDestroy方法停止运行c)注意:BroadcastReceiver是不能绑定服务的。d)一个绑定Service的Context对象还可以通过unbindService()来取消对服务的绑定。e)取消时,Service会调用unbind方法,若Service是通过bindService来启动的,还会调用onDestroy方法来停止服务。Service状态回调:onCreateonStartonBindonRebindonUnbindonDestroyBroadcastReceiver用户接收广播通知的组件(基类BroadcastReceiver)Android中的广播要么来自于系统,要么来自普通应用程序。很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。为了响应不同的事件通知,应用程序可以注册不同的BroadcastReceiver。所有的BroadcastReceiver都继承自基类BroadcastReceiver。BroadcastReceiver自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver可以启动Activity作为响应,或者通过NotificationMananger提醒用户。BroadcastReceiver是对发送出来的Broadcast进行过滤接收并响应的一类组件。发送Broadcast信息1.把要发送的信息和用于过滤得信息(如Action、Category)装入一个Intent对象2.调用Context.sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast()方法,广播该Intent对象3.使用sendBroadcast()或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法;4.而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行5.sendStickyBroadcast()方法主要的不同是,Intent在发送后一直存在,并且在以后调用registerReceiver()注册相匹配的Intent时会把这个Intent直接返回。6.若在使用sendBroadcast()方法时指定了接收的权限,这只有在AndroidManifest.xml中用标签声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来Broadcast。7.若在注册BroadcastReciever时,指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中用标签声明了,拥有此权限的Context对象所发送的Broadcast才有可能被这个BroadcastReceiver所接收。接收Broadcast消息1.继承BroadcastReceiver类,并实现onReceive方法2.注册BroadcastReceiver(有2种方法:一种方法是,静态地在AndroidManifest.xml中用标签声明,并在标签内用标签设置过滤器;另一种方法,动态地在代码中先定义并设置好一个IntentFilter对象,然后再需要注册的地方调用Context.registerReceiver()方法)(取消注册时,调用Context.unregisterReceiver()方法)ContentProvider为解决应用程序间数据通信、共享的问题(基类ContentProvider)在Android中,每个应用程序都是用自己的用户ID并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。ContentProvider可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是Android文件系统、SQLite数据库或者其他合理的方式。当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver,然后传入响应的URI就可以了。ContentProvider继承自基类ContentProvider,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序并不是直接调用这组方法,而是通过调用ContentResolver对象的方法来完成。ContentResolver对象可以与任意ContentProvider通信。要为当前应用程序的私有数据定义URI,就需要专门定义一个继承自ContentProvider的类,然后根据不同的操作调用的方法去实现这些方法的功能。ContentResolver类为应用程序提供了接入Content机制的方法。要构造一个ContentResolver对象可以为构造方法ContentResolver(Contextcontext)传入一个Context对象,也可以直接通过Context对象调用getContentResolver()方法获得有的ContentResolver对象后,就可以通过调用其query()、insert()、update()等方法来对数据进行操作了。一旦需要以上4种Android应用程序基本组件完成请求,Android会首先确认该组件所在进程是否运行,如果没有运行,Android将先启动进程,同时确认被请求组件的实例是否存在,否则将创建一个新的组件实例。Intent连接组件的纽带以上4种基本组件中,除了ContentProvider是通过ContentResolver激活外,其他3种组件Activity、Service和BroadcastReceiver都是由Intent异步消息激活的。Intent在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此,Intent是包含具体请求信息的对象。针对不同的组件,Intent所包含的消息内容有所不同,且不同组件的激活方式也不同,且不同类型组件有传递Intent的不同方式。Intent是一种运行时绑定(runtimebinding)机制,它能够在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表到某种请求或者意愿,Android会根据意愿的内容选择适当的组件来处理请求。激活一个新的Activity,或者让一个现有的Activity执行一个新的操作,可以通过调用如下两种方法(这两汇总方法需要传入的Intent参数称为ActivityActionIntent):1.Context.startActivity()2.Activity.startActivityForResult()启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:1.Context.startService()2.Context.bindService()发送广播Intent(所有已注册的拥有与之相匹配IntenFilter的BroadcastReceiv就会被激活),可以调用如下三种方法:1.Context.sendBroadcast()2.Context.sendOrderBroadcast()3.Context.sendStickBroadcast()Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity、Service或BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,BroadcastIntent消息只会发送给BroadcastReceiver,而绝不可能发送给Activity或Server。有startActivity()传递的消息也只可能发送给Activity,由startService()传递的Intent只可能发送给Service。Intent对象抽象地描述了执行操作,Intent的主要组成部分;1.目标组件名称。可选项a)组件名称是一个ComponentName对象,是目标组件类名和目标组件所在应用程序包的组合b)组件中的包名不一定要和manifes文件中包名完全匹配c)如果Intent消息中指明了目标组件的名称,这就是一个显示消息,Intent会传递给指明的组件。d)如果目标组件名称并没有指定,Android则通过Intent内的其他信息和已注册的IntentFilter的比较来选择合适的目标组件2.Action隐式比较a)描述Intent所触发动作的名字字符串。b)理论上Action可以为任何字符串,而与Android系统应用有关的Action字符串以静态字符串常量的形式定义在了Intent类中。3.Data隐式比较a)描述Intent要操作的的数据的URI和数据类型。b)正确设置Intent的数据对于Android寻找系统中匹配Intent请求的组件很重要。4.Category隐式比较a)是对被请求组件的额外描述信息。b)Android也在Intent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论