Activity的生命周期和启动模式

来源:互联网 发布:网络优化是什么意思 编辑:程序博客网 时间:2024/06/05 19:55

开始学习《Android开发艺术探索》,大致看了下目录和内容,觉得知识点很多,也很有用,于是想利用博客的方式进行二次学习,加深自己的理解。

最近也在想办法利用艾宾浩斯遗忘曲线来帮助学习,因为我发现很多时候看完书,当时都懂,但是过几天,甚至过个一两天就忘了,这是很没用的!学了还是得记得才行!

进入正题:

一:Activity的生命周期全面解析


1.onCreate():    表示Activity正在被创建,这是生命周期的第一个方法,我们可以在这个方法中做一些初始化工作。

2.onStart():       表示Activity正在被启动,即将开始,这时候Activity已经可见了,但是还没有出现在前台,所以我们看不到(可见不是说你就一定要看见它,因为还在后天,但是他已经创建好了,所以说可见,但是你看不到)

3.onRestart():   表示Activity正在重新启动,一般情况下是用户行为导致的,比如按了Hone键切换到桌面,那么onPause和onStop就会被调用,再从桌面回到这个Activity时就会执行onRestart(),然后再执行onStart(),再执行onResume()。

4.onResume(): 表示Activity已经可见,并且出现在前台,开始活动了。注意:onStart和onResume都是表示Activity已经可见,但是onStart时,Activity在后台,onResume时在前台

5.onPause():    表示Activity正在停止,紧接着OnStop就会被调用。注意:不能在这个方法内执行耗时操作,因为onPause必须先执行,新的Activity的onResume()才能执行!

6.onStop():       表示Activity即将停止,可以做一些相对重量级的回收工作,但是同样不能太耗时。

7.onDestroy():  表示Activity即将被销毁,这是生命周期内的最后一个回调,可以在这做一些回收工作和最终的资源施放。


一些具体说明:

1.一个新Activity正常启动过程:onCreate->onStart->onResume.

2.当用户按back键退出时:onPause->onStop->onDestroy.

3.当用户打开新Activity或按home回到桌面时:onPause->onStop.

4.当用户重新返回该Activity时:onRestart->onStart->onResume

5.当Activity被系统回收后再次打开时:生命周期方法回调过程和 1 一样,当时有一些方法不一样,在后面详细解释。



异常情况下的Activity生命周期分析:

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建:

   什么是 资源相关的系统配置发生改变:比如横竖屏切换,横竖屏需要使用不同的图片,在切换的时候,在默认情况下,Activity会被销毁并重新创建(当然也有办法阻止系统重新创建我们的Activity)。

    在这种异常情况下终止的,会调用:onPause、onStop、onDestroy生命周期方法,同时,系统还会调用onSaveInstanceState()来保存当前Activity的状态,这个方法在onStop之前调用,与onPause的调用时间无关,并且只有在异常终止情况下才会调用该方法。之后,当Activity被重新创建时,会调用onRestoreInstanceState()方法,并且会把销毁时onSaveInstanceState()方法保存的Bundle对象作为参数,传递给onRestoreInstanceState()和onCreate()方法。我们就可以取出之前保存的数据并恢复。从时序上说:onRestoreInstanceState()的调用时间在onStart()之后。

    我们还要知道一点:在Activity在异常情况下需要被销毁重建时,系统会帮我们自动恢复一些数据,如:文本框用户的输入数据、listview的滚动位置等。每个View都有系统可以自动恢复的数据,具体哪些需要查看源码。。。   

    关于保存和恢复的工作流程大致:一种典型的委托思想,上层委托下层、父容器委托子元素去处理一件事。

      如何保证系统配置发生改变后,Activity不被重新创建:给Activity指定configChanges属性,android:configChanges="orientation"  这个orientation属性只是其中一个,还有更多的属性自己参考资料。。。


2.资源内存不足导致低优先级的Activity被杀死:

    这种情况不好模拟,但是数据存储和恢复过程和上面 1 所说的一样。

    介绍一下Activity优先级:

      (1)前台Activity,正在和用户交互,优先级最高。

      (2)可见但非前台,比如一个Activity中弹出了一个对话框,导致Activity可见,但是不可和用户直接交互

      (3)后台Activity,已经暂停的Activity,比如执行了onStop,优先级最低。

   如果一个进程没用四大组件在执行,那么很快将会被系统杀死,因此一些后台工作放入Service中,保证有一定的优先级。


二、Activity启动模式

四种启动模式:

standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)、singleInstance(单实例模式)

1.standard:  默认启动模式,每此启动一个Activity都会重新创建一个新的实例,不管之前这个实例是否存在。

2.singleTop:如果该Activity已处于栈顶,那么再启动该Activity,不会再创建一个新的实例,如果不在栈顶,则会在栈顶创建新的。

3.singleTask:该模式Activity请求启动后,系统首先会寻找是否存在该Activity想要的认为栈,如果不存在,则创建其任务栈,并把其实例放入,如果存在,则看是否在最上面,在最上面则不创建新实例,不在最上面则把其上面的其他活动实例清除,使其处于最上面。

4.singleInstance:这是一种加强的singleTask模式,除了具有singleTask所具有的的特性外,还有一点:具有该模式的Activity只能单独处在一个任务栈中。


TaskAffinity:

什么是Activity所需的任务栈呢? 需要从一个参数说起:TaskAffinity。

TaskAffinity可以翻译为:任务相关性。  这个参数标识了一个Activity所需的任务栈的名字。默认情况下,Activity所需的任务栈名字为包名。我们可以对单独Activity指定任务栈名字。

TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

和singleTask配合:待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。

和allowTaskReparenting配合:有点复杂。。参考《Android开发艺术探索》P19页 ......


如何指定Activity启动模式:

1.Menifest内的Android标签内: android:launchMode="启动模式"

2.通过Intent中设置标记位来给Activity指定启动模式:intent.addFlags(Flag); Flag标识为有很多,有需要得自己查资料哦。。。

优先级:两者同时都使用了,第二者优先级更高。

第一种无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识。

第二种无法将Activity指定为singleInstance模式。


三、Activity的隐式启动,IntentFilter的匹配规则

隐式启动Activity需要Intent能够匹配目标组件的IntentFilter中设置的信息,如果不匹配则无法启动目标Activity。

IntentFilter中的过滤信息有:action、category、data。

action匹配规则:

一个IntentFilet中可以设置多个action,只要Intent的action存在并且能匹配任意一个,即可匹配action成功。

category匹配规则:

category是个字符串,如果Intent内含有一个或多个category,则全部必须和IntentFilter内的任意一个或多个category相匹配。如果没有,这个Intent仍可以匹配成功,因为系统在调用starActivity或startActivityForResult时会默认为Intent加上一个默认category。同时,为了让我们能接收隐式调用,就必须在IntentFilter内指定默认的category,即 ”android.intent.category.ERFAULT“。

data匹配规则:

首先需要了解data的结构,因为data有些复杂,这个需要读者自己去找资料了。。。因为我也没看。。。有点懒,以后补上。。。


最后,如果通过隐式的方式启动Activity的话,需要进行判断,看是否能成功匹配,否则会出错误。

可以使用PackageManager的resolveActivity()或Intent的resolveActivity()方法进行判断,如果没用匹配则返回NULL。




终于写完了。。。真累。

虽然不多,但真的写了好久。。。而且很多知识还是对着书来的。

后面还会继续更新完善,但是不一篇总结书上一章了,实在是累。。。

如果哪里有错请一定帮我指出。


还没有被点赞过,如对你有用就给我点个赞吧~~




原创粉丝点击