您的位置:首页 > 其它

关于Activity的生命周期和启动模式(附Demo)

2016-02-12 16:30 417 查看
首先肯定是谷歌官方的这张图:

一个Activity有七个生命周期:(正常的情况)
onCreate:一个Activity刚刚被创建,里面可以执行界面的初始化,数据加载。
onRestart:这个Activity还没被销毁的时候,重新再次回到这个Activity就会执行。比如,Home键之后。
onStart:这时的Activity已将可见了,但是没有焦点,和用户不能交互。
onResume:出现在前台获得焦点,可以喝用户进行交互。
onPause:A的Activity覆盖在B的Activity之上的时候,B的Activity的onPause被调用。这里需要注意的是,正常情况下onStop可能很快就会被调用。但是你强行快速的回到A的Activity那么A的onResume就会被调用。因此:onPause之后不是必然会调用onStop。里面的逻辑不能太耗时,否则会影响下一个Activity的显示。因为Activity必须执行完onPause,才能加载另一个Activity。
onStop:也可以做一些稍微耗时的操作。
onDestory:最后一个工作,资源释放。
透明模式不会调用onStop。
问题1:为什么Android要这么设置onStart和onStop,onResume和onPasue?他们每一对看起来都一样。
Android设计的角度是:onStop和onStart是从是否可见角度出发。onResume和onPause是是从有焦点出发。
问题2:当前Activity为A,如果这时用户打开一个新的ActivityB,那么B的onResume和A的onPause哪个先执行?

明显A执行完onPause之后B开始onCreate-->onStart-->onResume,然后再执行A的onStop。所以相对耗时的操作应该在B里执行。
异常情况的生命周期:
1.资源相关的系统配置发生变化的时候Activity的重建
onSaveInstanceState会被用来存储数据,和onPause的执行没有先后顺序。销毁了Activity自然就需要重建,系统会自己调用onRestoreInstance方法来获得数据。
系统只会在Activity异常销毁的时候来调用onSaveInstanceState和onRestoreInstance方法。
2.系统内存不足会导致优先级低得Activity被杀死。
优先级可以有三种:
1.可见且前台
2.可见但是后台
3.不可见后台(所以不想被杀死就用service)
如何在这些情况下,不重新创建Activity:
在此Activity下添加configChanges标签。在代码中onConfigurationChanged会被调用。
Activity的启动模式:(注意这四种模式里,重建指的就是onCreate,onStart,onResume重新执行,不需要重建指的就是会进行onNewIntent方法的回调)
首先,我刚用一个叫有牛软件的时候,熟悉了一下这个软件,然后按back键,然后一次次的回退我看过的每一个Activity,我都要疯了。这时候就是这个App的启动模式出了问题。
standard:
这种模式是最基本的,不管怎么样,被启动的Activity都会被重建,就是执行onCreate,onStart,onResume方法。
 
要点就是哪一个Activity启动你的那么被启动的Activity就会进入启动它的Activity的任务栈里。
A-->B,那么B就会进入到A的任务栈里面。
 
当然这里我们要注意,Calling 
startActivity fromoutside of an activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Isthis really what you want?
 
这就是standard模式下,你启动一个Activity的时候可能是用了getApplicationContext.startActivity,那么显然这个是一个Context是没有任务栈的,所以启动失败,需要手动设置一个flag位,就是log里提示你的那个。这时Activity启动就是用singleTask启动了。
 
singleTop:
这个模式很简单,ABDC
simpleTop下,启动C,那么不会重建C。启动D,就会变成ABDCD。
singleTask:
这个模式具体是说
ABCD
,这时启动C那么会进行clearTop此时的任务栈里只剩ABC,将C调入栈顶。
最需要注意的就是这个clearTop操作。
 
这个模式注意还有个问题就是任务栈的事。需要哪个任务栈就创建哪个再压入Activity。
singleInstance:
这个模式是加强版的singleTask,会单独为这个Activity创建一个任务栈,当然这里面不会又别的Activity所以这个栈里的Activity始终不会被重建
 
….说了这么多,什么是任务栈啊。。
 
任务栈被提及一般是在singleTask模式里,在Activity的manifest文件里的Acticity标签下有一个属性是taskAffinity,它的意思就是任务栈。
 
任务栈主要是和singleTask或者allowTaskReparenting一起用的。
 
和singleTask一起用的时候很简单。Activity会运行到和taskAffinity名字相同的任务栈里。
 
和allowTaskReparenting一起使用的时候,allowTaskReparenting为true,Activity会运行到属于自己应用的任务栈中。
 
总结,standard,simpleTop,singleInstance都是很好理解的。记住一点就是谁启动我,我就在它的任务栈里。
singleTask就比较复杂,主要是clearTop要牢记。
TestDemoGithub:测试代码
https://github.com/swxca/BlogTestCode
 
Activity指定启动模式:
两种:
1.是代码中给Intent设置flags
2.在<Activity>标签里指定。
区别:代码中设置的方式优先级较高,标签的方式无法设定FLAG_ACTIVITY_CLEAR_TOP,代码的方式无法设定singleInstance。
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: