Android生命周期总结
打开 A activity 的执行流程 : onCreate() onStart() onResume()
这个时候如果打开BActivity
A:onPause() 在这里A失去焦点后会被系统加入到可能消灭的activity中
B:onCreate() onStart() onResume()
如果B是一个没有占满全屏(能看见Aactivity)的话,Aactivity不会执行onStop方法
如果B占满全屏,那么
A:onStop()
现在我们在BActivity 我们可以就继续让BActivity运行 也可以按下home键 也可以按下back键
如果继续运行B 出现系统内存不足的情况的话 系统会按照线程优先级进行回收记录下的危险Activity (后面看线程优先级) 如果已经全部回收掉,内存仍然溢出,那么程序将会崩溃掉(所以我们写程序一定要注意内存泄露啊 内存泄露啊)
我们按下back键
B:onPause() 回收等级1
B:onStop() 回收等级2
B:onDestroy() 执行后被系统回收
回到AActivity(如果A还没被系统回收的话)
A:onResume()
如果B是占满全屏的话
A:onStart()
A:onResume()
如果我们按下home键
B:onPause() 回收等级1
B:onStop() 回收等级2
回到主界面
总结重点:
dialog不会改变生命周期,说明dialog是属于Activity内部的界面
按下back键一定会执行Destroy进行销毁 而home不会执行Destroy
onPause() 方法中做持久化工作的确万无一失 可如果做持久化工作可能会让系统比较卡,为了用户体验度,所以在这里建议开发的时候把最最最重要的东西放在这里进行持久化,其余放到onStop中持久化
Android3.0以后的版本 onStop一定会在系统回收前执行 所以这里可以做保存数据持久化工作. 3.0版本哦
系统危险等级:
1 如果一个app正在与用户交互,那么它所在的进程具有最高优先级;
2 如果一个app是可见失去焦点的,例如被一个对话框部分遮挡,它所在进程具有第二高的优先级;
3 如果app当前是不可见失去焦点的,也就是被切换到了后台,则它所在进程具有第三高的优先级;
4 如果这个后台app启动了一个service,则它比相同优先级的后台app优先级高一些;
5 最后,如果一个进程里没有包含任何app,那么这个进程的优先级是最低;
还记得Android的第一句:
DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念.
当我们运行一个app的时候,这个app在独立的线程中运行.它拥有独立的线程和自己独立的task,与其他程序没有任何关系
最后抄一个实际的例子来说明Activity的各个生命周期。假设有一个程序由2个Activity A和B组成,A是这个程序的启动界面。当用户启动程序时,Process和默认的Task分别被创建,接着A被压入到当前的Task中,依次执行了 onCreate, onStart, onResume事件被呈现给了用户;此时用户选择A中的某个功能开启界面B,界面B被压入当前Task遮盖住了A,A的onPause事件执行,B的 onCreate, onStart, onResume事件执行,呈现了界面B给用户;用户在界面B操作完成后,使用Back键回到界面A,界面B不再可见,界面B的onPause, onStop, onDestroy执行,A的onResume事件被执行,呈现界面A给用户。此时突然来电,界面A的onPause事件被执行,电话接听界面被呈现给用 户,用户接听完电话后,又按了Home键回到桌面,打开另一个程序“联系人”,添加了联系人信息又做了一些其他的操作,此时界面A不再可见,其 onStop事件被执行,但并没有被销毁。此后用户重新从菜单中点击了我们的程序,由于A和其所在的进程和Task并没有被销毁,A的onRestart 和onStart事件被执行,接着A的onResume事件被执行,A又被呈现给了用户。用户这次使用完后,按Back键返回到桌面,A的 onPause, onStop被执行,随后A的onDestroy被执行,由于当前Task中已经没有任何Activity,A所在的Process的重要程度被降到很 低,很快A所在的Process被系统结束