Activity中AndroidMainfest启动模式
Android开发者在AndroidMainifest文件中一共设计了四种启动模式:standard,singleTop,singleTask,singleInstance。想要应用这些启动模式,需要在权限文件中中加入<activity android:launchMode=“”>,引号内添加这几种启动模式。本篇博客会一一讲解这四种模式。
1.standard
它是默认的启动模式,在权限文件中不指定Activity的启动模式的时候,activity会使用这种方式启动activity,这种启动模式每次都会创建新的实例,每次创建新的Activity之后,就会覆盖在原有的Activity之上。
2.singleTop
当在权限文件中设置Activity启动模式为singleTop,那么在启动的时候,系统会判断栈顶是不是要启动的Activity,如果是则不创建新的Activity直接引用这个,如果不是会重新创建新的Activity。
开发过程中应用实例:一个聊天app,在接收到消息后弹出Activity,我们对这个Activity应该设置为这种启动模式,因为不能每一次来消息都要重新创建一个Activity,这么设置启动模式就解决了这个麻烦。
3.singleTask
singleTask,在同一个APP中启动SingleTask的Activity,检查整个Activity栈中是否存在当前需要启动的Activity。如果存在,则将该Activity以上的Activity进行销毁。
如果是是在其他程序以singleTask模式来启动这个Activity,它将创建一个新的任务栈,这里需要注意是,如果启动的模式为SingleTask的activity已经在后台的一个任务栈中了,那么启动后,后台的这个任务栈将一起被切换到前台中。
开发过程中应用实例:用来退出整个应用的启动模式。主activity设为这种启动模式,要退出的Activity都会转到主Activity,这时候它会变为栈顶,它之上的Activity都会被消除,然后退出程序,将这最后一个Activity结束掉。(注意会有一个onNewIntent的使用)
4.singleInstance
启动模式为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在一个Activity。笔者对于这种情况用的还比较少,欢迎大家给予评论、指点。
注意:
1.栈结构,是一种后进先出的线性表。正常情况下的android任务栈,新启动的Activity会被置于任务栈的顶端,处于活动状态,启动它的Activity仍然会保留到任务栈中,处于停止状态,当用户按返回键或者调用finsh()方法的时候,系统会移除顶部的Activity,让下面的Activity变成活跃状态。这是正常的状态,但是上面说的四种启动模式都是在权限文件AndroidMainifest中进行了设置,拥有特权。
2.如何给Activity指定启动模式
两种方式一,一种是通过AndroidMenifest,一种是通过在Intent中设置标志位为Activity指定启动模式
代码如下:
<activity
android:name="com.sweety.SecondAct"
android:configChanges="screenLayout"
android:launchMode="singleTask"
android:label="@string/app_name"/>
Intent intent=new Intent();
intent.setClass(MainAct.this,SecondAct.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
那么两种方式的区别是什么?首先优先级上第二种方式的优先级高于第一种方式,两种方式同时存在的时候以第一种方式为准;两种方式在限定范围上有所不同,例如,第一种方式无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP,第二种无法为Activity指定singleInstance。