四大组件及其生命周期

来源:互联网 发布:剑网三军娘捏脸数据 编辑:程序博客网 时间:2024/05/22 16:46
                         -----[摘自](http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html) 

Android四大组件分别是Activity,Service,Content Provider和BroadcastReceiver。
一 、Activity
Activity是Android程序与用户交互的界面。它上面可以显示一些控件也可以监听并处理用户的事件做出响应。
注册:需要在AndroidManifest文件中进行配置,元素的name 属性指定了实现了这个activity 的Activity 的子类。icon 和label 属性指向了包含展示给用户的此activity 的图标和标签的资源文件。
激活:Activity的激活通过传递一个Intent 对象至Context.startActivity()或Activity.startActivityForResult()以载入(或指定新工作给)一个activity。相应的activity 可以通过调用getIntent() 方法来查看激活它的intent。
关闭:可以通过调用它的finish()方法来关闭一个activity。
生命周期:Activity整个生命周期的4种状态、7个重要方法和3个嵌套循环。
4种状态:
1.活动(Active/Running)状态
当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于运行状态,同一个时刻只会有一个Activity 处于活动(Active)或运行(Running)状态
2.暂停(Paused)状态
当Activity失去焦点但仍对用户可见(如在它之上有另一个透明的Activity或Toast、AlertDialog等弹出窗口时)它处于暂停状态。暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但是当系统内存极小时可以被系统杀掉。
3.停止(Stopped)状态
完全被另一个Activity遮挡时处于停止状态,它仍然保留着所有的状态和成员信息。只是对用户不可见,当其他地方需要内存时它往往被系统杀掉。
4.非活动(Dead)状态
Activity 尚未被启动、已经被手动终止,或已经被系统回收时处于非活动的状态,要手动终止Activity,可以在程序中调用”finish”方法。
内存不足时,Dalvak 虚拟机会根据其内存回收规则来回收内存:
1. 先回收与其他Activity 或Service/Intent Receiver 无关的进程(即优先回收独立的Activity)因此建议,我们的一些(耗时)后台操作,最好是作成Service的形式
2.不可见(处于Stopped状态的)Activity
3.Service进程(除非真的没有内存可用时会被销毁)
4.非活动的可见的(Paused状态的)Activity
5.当前正在运行(Active/Running状态的)Activity
7个方法:
onCreate(Bundle saveInstanceState);
当Activity第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法通常用于初始化设置: 1、为Activity设置所要使用的布局文件2、为按钮绑定监听器等静态的设置操作。
onStart();
当Activity可见未获得用户焦点不能交互时系统会调用
onRestart();
当Activity已经停止然后重新被启动时系统会调用
onResume();
当Activity可见且获得用户焦点能交互时系统会调用
onPause();
当系统启动另外一个新的Activity时,在新Activity启动之前被系统调用保存现有的Activity中的持久数据、停止动画等,这个实现方法必须非常快。当系统而不是用户自己出于回收内存时,关闭了activity 之后。用户会期望当他再次回到这个activity 的时候,它仍保持着上次离开时的样子。此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,在onPause()之前被触发,当系统为了节省内存销毁了Activity(用户本不想销毁)时就需要重写这个方法了,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已经保存的临时状态数据传入,因为onSaveInstanceState()方法不总是被调用,触发条件为(按下HOME键,按下电源按键关闭屏幕,横竖屏切换情况下),你应该仅重写onSaveInstanceState()来记录activity的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。
onStop();
当Activity被新的Activity完全覆盖不可见时被系统调用
onDestroy();
当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate ()方法中创建的资源,如结束线程等。
3个嵌套循环
1.Activity完整的生命周期:从第一次调用onCreate()开始直到调用onDestroy()结束
2.Activity的可视生命周期:从调用onStart()到相应的调用onStop()
在这两个方法之间,可以保持显示Activity所需要的资源。如在onStart()中注册一个广播接收者监听影响你的UI的改变,在onStop() 中注销。
3.Activity的前台生命周期:从调用onResume()到相应的调用onPause()。
总结:
生命周期5s
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变。
Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState –> onPause –> onStop,再次进入激活状态时: onRestart –>onStart—>onResume
Acitivity被异常终止的情况下,onSaveInstanceState方法去保存数据view相关的状态系统,必须在onStop之前调用,和onPause没有既定的时序关系。当Actiivty被重新创建后,系统会调用onCreate和onRestoreInstanceState恢复数据,在onStart之后,onRestoreInstanceState不需要判断Bundle savedInstanceState一定是有值的。
这里写图片描述

二、BroadcastReceive广播接收器
广播接收器没有用户界面。可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。
注册:广播分静态注册和动态注册两种:动态注册,当用来注册的Activity关掉后,广播也就失效了。
激活:广播类型:
普通广播,通过Context.sendBroadcast(Intent myIntent)发送的
有序广播,通过Context.sendOrderedBroadcast(intent, receiverPermission)发送的,第二个参数决定该广播级别,值越大 , 发送的优先级越高;广播接收者接收广播时的级别级别(可通过intentfilter中的priority进行设置。高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播。
异步广播,通过Context.sendStickyBroadcast(Intent myIntent)发送的,发送异步广播要: 权限,接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉。
sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)方法,该方法具有有序广播的特性也有异步广播的特性。
关闭:内容提供者仅在响应ContentResolver 提出请求的时候激活。而一个广播接收器仅在响应广播信息的时候激活。所以,没有必要去显式的关闭这些组件。
生命周期:生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息。
它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束

三、Service
Serivice没有用户界面的,后台服务于Activity,可以用来开发如监控类程序。
注册:需要在AndroidManifest文件中进行配置, 元素用于声明服务。
激活:两种启动方式:Context.startService()和Context.bindService()。
通过startSeivice()方法启动的服务与调用者没有关系,即使调用者关闭了,服务仍然运行,需通过调用Context.stopService()停止服务,此时系统会调用onDestory()。使用此方法启动时,服务首次启动系统先调用服务的onCreate()–>onStart(),如果服务已经启动再次调用只会触发onStart()方法。
通过bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()–>onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()–>onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()–>onDestory()。
关闭:对于通过startService()方法启动的服务要调用Context.stopService()方法关闭服务,使用bindService()方法启动的服务要调用Contex.unbindService ()方法关闭服务。
生命周期这里写图片描述
四、ContentProvider内容提供者
ContentProvider是Android提供的第三方应用数据的访问方案,使一个应用程序的指定数据集提供给其他应用程序。其他应该程序可以通过ContentResolver类从该内容提供者获取或存储数据。只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。
好处:统一数据访问方式。
注册:需要在AndroidManifest文件中进行配置, 元素用于声明内容提供者。
激活:当接收到ContentResolver 发出的请求后,内容提供者被激活。

0 0