android系统中,有很多个Activity分别都是来自于不同应用程序的,Android系统仍然可以将它们无缝地结合到一起。那这一切是怎么实现的呢?这就要讲到本文要介绍的Activity任务栈以及Activity启动模式了。
任务栈(Task):
是一种用来放置Activity实例的容器.
启动模式:
①标准模式(Standard)
在这种模式下,每次会默认创建一个新的实例。
应用场景:绝大多数Activity。
②栈顶复用模式(SingleTop)
如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。避免栈顶的activity被重复的创建。
应用场景:在通知栏点击收到的通知.
③栈内复用模式(SingleTask)
activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且清空这个activity任务栈上面所有的activity。
应用场景:大多数App的主页。
④单例模式(SingleInstance)
单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。
应用场景:呼叫来电界面。
启动模式的设置:
1.通过在AndroidManifest文件中的属性andorid:launchMode来设置
<activity
android:launchMode="启动模式"?
</activity>??
2.通过Intent的flag来设置.
Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent,addFlags(Intent,FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
其中,
FLAG_ACTIVITY_SINGLE_TOP?栈顶复用模式(SingleTop)
FLAG_ACTIVITY_NEW_TASK?栈内复用模式(SingleTask)
FLAG_ACTIVITY_CLEAR_TOP?所有位于其上层的Activity都要移除,SingleTask模式默认具有此标记效果
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS?具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上
注意:
Intent设置方式的优先级 >?Manifest设置方式.
Manifest设置方式无法设定?FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式 无法设置单例模式(SingleInstance).