生命周期
如上图所示,Activity生命周期很简单共七个生命周期函数,oncreate(),onrestart(),onstart(),onresume(),onpause(),onstop(),ondestroy();
下面举两个例子来说明Activity生命周期函数调用关系。A Activity 打开 B Activity ,B占满屏幕,返回A。A Activity 打开 C Activity,C未占满屏幕,返回A。
(1)、B占满屏幕,A获取不到任何焦点
Action | A Activity | B Activity |
---|---|---|
Open A | onCreate()=>onStart()=>onResume() | - |
Open B | onPause()=>B=>onStop() | onCreate()=>onStart()=>onResume() |
Return A | onRestart()=>onStart()=>onResume() | onPause()=>A=>onStop()=>onDestroy() |
(2)、B未占满屏幕,A还能获取到焦点
Action | A Activity | B Activity |
---|---|---|
Open A | onCreate()=>onStart()=>onResume() | - |
Open B | onPause()=>B | onCreate()=>onStart()=>onResume() |
Return A | onResume() | onPause()=>A=>onStop()=>onDestroy() |
启动模式
Activity有四种启动模式,分别是standard,singleTop,singleTask,singleInstance。这四种启动模式将决定启动一系列Activity后,后退栈内的Activity的结构。
1、standard (默认启动模式)
这种启动模式,每启动一个Activity,便将这个Activity实例压入栈位于栈的顶端。
2、singleTop
这种模式,如果要启动的Activity实例已经存在于栈的顶端,系统会调用onNewIntent()方法,而不是在实例化一个Activity对象。如果要启动的Activity不在栈顶,则要重新创建。
3、singleTask
这种模式,若要启动的Activity在当前栈内,系统会调用onNewIntent()方法,而不是重新创建实例,此Activity上的其他实例都弹出栈,此Activity将位于栈顶。
4、singleInstance
这种模式,如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例。
关闭多个Activity
一、将Activity启动模式修改为singleTask
将某个Activity启动模式设置为singleTask模式,返回这个页面时,系统会关闭这个Activity之上的所有Activity。
二、程序维护Activity集合
使用ListView或者Stack等,每次打开新的Activity时,将引用存入到这个集合中,需要关闭的时候依次关闭Activity。
三、使用onActivityResult()递归关闭
在onActivityResult中接收上一个Activity的数据,关闭自身,再将数据传递下去。
四、通过BroadcastReceiver,关闭Activity
每个Activity中注册广播接收者,需要关闭应用的时候,发送广播,接收到广播关闭自身。(PS:此方法慎用)