和启动Activity有关的Intent标志

今天来介绍三个相对常用的启动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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值