(本文同步在个人Google博客中)
Lifecycle与Launch Mode的学习笔记而已。
1. Activity Lifecycle
http://developer.android.com/reference/android/app/Activity.html
---基本来自官方介绍,结合O'REILLY家的《Hello, Android》这本书
Android的activity有各种各样的状态,直接由下图表示:(Activity的启动,终止,中止,恢复等都符合下图流程,通过自动调用图中的onXX()函数进行状态的改变)
明白lifecycle有4个state,3个loop即可,两者结合起来理解。
4个state:
1)running--在程序最前端,动态阶段
2)paused(visible)--暂停阶段,但是可见的(比如弹出dialog或半透明widget,背后的activity还是可见的)
3)stoped(invisible)--停止阶段,已经不可见,仅在后台保存着状态与信息。当系统内存不足时这是最容易被杀死的状态。
4)killed--进程已被杀死阶段,从内存中释放出来。当需要再次展示给用户时,就必须重新onCreate()或onRestart() 。
3个loop:
1) entire lifetime--from onCreate() to onDestory()
完整的生命周期。进程在这个周期里始终是“存在”的状态。
2) visible lifetime--from onStart() to onStop()
可见的生命周期。进程在这个周期里始终是“可见”的状态,可见状态与信息都占据着内存。
3)foreground lifetime --from onResume() to onPause()
最前端的生命周期。进程在这个周期里就在任务棧的最顶端,始终running的状态。
在进程切换状态前后想要改写Activity的信息之类的,就Override对应的onXX()函数即可。
但此外还有两个常用的函数:
* onSaveInstanceState(Bundle)
* onRestoreInstanceState(Bundle)
前者在一时停止onPause()之前调用:
onSaveInstanceState(Bundle)--->onPause()
调用之后再恢复进程,就会调用后者,与其他函数的顺序为:
onCreate(Bundle)--->onStart()--->onRestoreInstanceState(Bundle)--->onResume()
动态instance通过Bundle保存进来,在onCreate(Bundle)或onRestoreInstanceState(Bundle)中提取Bundle恢复。
但是Google官网也说了,这两个函数不属于生命周期内部函数。所以有可能不会被调用。还是不推荐使用这两个函数。
虽然个人觉得在activity横竖屏切换时调用onSaveInstanceState(Bundle)保存输入字符,其他动态instance还挺好用的。= =|||
2. Launch Mode
http://developer.android.com/guide/topics/manifest/activity-element.html
http://developer.android.com/guide/components/tasks-and-back-stack.html
---还是参照Developers官方介绍
Launch Mode是AndroidManifest.xml中Activity设置参数:
android:launchMode=["standard"|"singleTop"|"singleTask"|"singleInstance"]
1)standard: 默认设置。
如下图任务棧所示,一调用startActivity()就会产生新的实例。于是也有可能一个activity被调用多次而没有正常退出,产生好几个实例。
2)singleTop:
顾名思义,任务棧只有单一的顶端。每次调用startActivity()时会检查栈顶,若是相同activity则启动onNewIntent()的方法,而不重新创建新的实例。
比如QQ的消息推送,好几条消息推送过来默认模式点击每条消息都会创建一个新的聊天界面的activity,设置singleTop之类可以保证聊天界面仅维持一个实例。
-------以上两个模式被官方归类为Normal,下面两个属于Special-------
3)SingleTask:
相对于singleTop,调用startActivity()时不只会检查栈顶,而是遍历整个棧。也是启动启动onNewIntent()保证整个棧中都只有activity对应的一个实例。所以叫single task。
比如上图任务棧,标志为“SingleTask”的Activity2被再次启动时,栈顶会退到Activity2,Activity3是被终止还是推到后台运行,要根据后面说的intent flag设置确定吧(这个我也不太清楚)。
4)SingleInstance:
类似SingleTask,只是会新开一个新棧来存放该activity的实例,且只有一个实例。(所以这个模式到底有什么意义,哦减少遍历时间?求大牛讲解)
*设置Launch Mode启动模式有两种方法:
1)像上面说的在AndroidManifest.xml中设置"standard"|"singleTop"|"singleTask"|"singleInstance"设置四种参数;
2)使用intent flag。就是在Intent中定义flag,然后调用startActivity()。
flag居然不是对应的四种模式,而只有三种!分别是:
FLAG_ACTIVITY_NEW_TASK:如果activity的实例存在,就调用onNewIntent()从后台调到前台,如前面所说的singleTask。
FLAG_ACTIVITY_SINGLE_TOP:不用说了,如前面的singleTop。
FLAG_ACTIVITY_CLEAR_TOP:如果activity的实例存在,就调用onNewIntent()从后台调到前台,但是在这前面的activity的实例都会被销毁(onDestroy())