https://github.com/NieJianJian/AndroidNotes,内容将持续更新,欢迎star。
1. Activity的启动模式
Activity的启动模式有四种,分别是:standard、singleTop、singleTask、singleInstance。它们的使用方法是在AndroidManifest中设置Activity的android:launchMode
属性:
<activity android:name=".MainActivity" android:launchMode="singleTask" />
还可以通过Intent中设置标识位来为Activity指定启动模式:
Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
当以上两种方式同时存在的时候,以第二种方式为准。
1.1 四种启动模式介绍
-
standard
标准模式。每次都会创建新的实例,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
-
singleTop
栈顶复用模式。在启动时判断要启动的Activity是否已经位于栈顶,如果是则不会创建新的Activity实例,同时它的onNewIntent方法会被回调;如果要启动的Activity已经存在与栈中,但不是位于栈顶,同样需要创建新的Activity实例。栈顶复用的生命周期调用链如下:
onPause -> onNewIntent -> onResume
-
singleTask
栈内复用模式。只要启动的Activity在栈内存在,那么多次启动该Activity都不会创建新的实例,不管是不是位于栈顶。和singleTop一样会调用onNewIntent方法。singltTask还有一个特殊的属性,会将栈内位于该启动Activity之上的Activity全部销毁。
上述的情况是同一个APP中启动这个singleTask的Activity,如果其他程序启动这个singleTask模式的Activity,那么会创建一个新的任务栈。
如果启动模式为singleTask的Activity已经在一个后台任务栈中,那么启动后,后台的这个任务栈将被一起切换到前台。
-
singleInstance
单实例模式。会创建一个新的任务栈存放要启动的Activity,而且该任务栈中只存在这一个Activity。假设应用A的任务栈中创建了MainActivity的实例,且启动模式为singleInstance,如果应用B也要启动MainActivity,则不需要创建,两个应用共享该Activity实例。
1.2 使用场景:
- standard:默认的启动模式,如果不指定Activity的启动模式,则使用这种方式启动Activity。
- singleTop:常用于详情页,比如微信接收到10条通知栏消息,我们不可能创建10个实例,所以采用singleTop
- singleTask:常用于Home主页面,不管在哪个页面返回到主页面,都cleanTop清除掉主页面之上的页面。也可用于退出整个应用:在要退出的Activity中转到启动模式为singleTask的主Activity,从而将主Activity之上的Activity都清除掉,然后重写主Activity的onNewIntent方法,然后调用finish()。
- singleInstance:常见于闹钟页面、来电页面。
1.3 其他
-
用ApplicationContext去启动Activity会报错,错误如下:
android.util.AndroidRuntimeException: Calling startActivity