今天来介绍三个相对常用的启动Activity的Intent标志
- Intent.FLAG_ACTIVITY_SINGLE_TOP
- Intent.FLAG_ACTIVITY_CLEAR_TOP
Intent.FLAG_ACTIVITY_NEW_TASK
1.Intent.FLAG_ACTIVITY_SINGLE_TOP
和Activity的启动模式singleTop类似:
a:当activity不存在的时候,创建一个新的Activity对象加载到当前Task里面b:如果Activity已经存在,并处于栈顶,开启自身不会再创建新的Activity对象
c: 如果Activity已经存在,处于栈中,开启该界面创建一个新的Activity对象加载到当前Task中
2.Intent.FLAG_ACTIVITY_CLEAR_TOP
设置了这个标志,如果要启动的activity已经在当前Task中运行,则不会创建新的实例,而是关闭上面所有的activity,然后把这个intent作为一个新的intent传递到当前Task栈顶部。
举个例子:当前Task中有A,B,C,D四个Activity,我们在D中启动B加上标志Intent.FLAG_ACTIVITY_CLEAR_TOP,那么此时Task中就剩下A,B了。
当Intent传递到栈顶时,就要分情况了:
a:如果B没有指定任何启动模式或者没有指定 FLAG_ACTIVITY_SINGLE_TOP 这个标志,此时就会重新创建一个B的实例。
b:如果指定了任何启动模式或者设置了FLAG_ACTIVITY_SINGLE_TOP 这个标志,那莫不会创建新的实例,而是调用onNewIntent方法,把intent传递进去。
使用:
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。
在D中使用下面的代码:
Intent intent = new Intent();
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意
startActivity(intent);//启动A Activity
finish();//kill掉自己
在A中加入代码:
//Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
//退出
if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
finish();
}
}
A的Manifest.xml配置成android:launchMode=”singleTop”
说明:
一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode=”singleTop”
不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A finish掉。 栈中A,B,C,D全部被清理。所以整个程序退出了。
3 . Intent.FLAG_ACTIVITY_NEW_TASK
设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性一样,所以下面的a情况会在同一个栈中,前面这句话有点拗口,请多读几遍),如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity
如果在service中跳转Activity,必须去设置意图标志位
Intent.FLAG_ACTIVITY_NEW_TASK