Activiry的启动模式

本文详细介绍了Android中Activity的不同启动模式,包括standard、singleTop、singleTask和singleInstance,并解释了如何通过AndroidManifest文件或Intent标志来配置这些模式。此外,还探讨了TaskAffinity的概念及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LaunchMode

  1. standard
    标准模式,默认模式
    每次启动一个Activity都会新建一个实例,不管新建的是否是其自身,需要保证,驱动的Context不是ApplicationContext等
  2. singleTop
    栈顶复用模式
    如果新的Activity已经位于栈顶,那么这个Activity不会呗创建,同时他的onNewIntent方法会被回调,而不会调用onCreate、onStart。
  3. singleTask
    栈内复用模式
    栈内单例,只要Activity在一个栈内存在,那么这个Activity不会被重建,同时他的onNewIntent会被调用。
    singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己,切记切记”这点是毋庸置疑的。
  4. singleInstance
    单实例模式
    单独的存在于一个栈中。

TaskAffinity(任务相关性)。这个参数标志了一个应用所需要的任务栈的名字。一般情况下为应用的包名。我们也可以单独指定TaskAffinity属性,主要和singleTask和allowTastReparenting属性配对使用,在其他情况下没有意义。另外分为前台任务栈和后台任务栈,可以切换。

如何给Activity指定启动模式呢

  1. 在androidMeinifest中配置launchmod
  2. 或者通过intent中设置标志位来为Acitivty来指定启动模式。

比如:

Intent intent  = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

第二种的方式的优先级高于第一种,同时存在时,以第二种为主。
第一种不可以直接设定FLAG_ACTIVITY_CLEAR_TOP;
第二种无法为Activity指定singleInstance模式;

Activity的Flags

大部分情况下不要提要手动设置标记位

  • FLAG_ACTIVITY_NEW_TASK:指定singleTask’
  • FLAG_ACTIVITY_SINGELE_TOP
  • FLAG_ACTIVITY_CLEAR_TOP:在同一个任务栈中 位于它上面的包括它本省都会被出栈,和singleTask 一起出现的时候,不包括它本身
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENETS:这个标记使得这个Activity不会出现在历史列表中

IntentFilter的匹配规则

启动Activity分为隐式和显式。原则一个Intent不能及时显式又是隐式,冲突时候显式为主。
隐式的调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配是无法启动目标的。
一个Activity中可以有多了intent-filter,但是匹配的只要有一组就可以启动
匹配规则

   Intent intent = new Intent("com.example.ACTION_START");
    //再添加一个category
   intent.addCategory("com.example.activitytest.MY_CATEGORY");
   intent.setDataAndType(Uri.parse("file//abc"),"image/png");
   <activity
            android:name=".SecondActivity">      
            <intent-filter >
                <action android:name="com.example.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.example.activitytest.MY_CATEGORY"/>
            </intent-filter>    
   </activity>

action的匹配规则

Intent中至少有一个,和规则中的一个匹配,区分大小写

category的匹配规则

Intent中的所有category都和规则中的一个匹配,如果没有category依然可以匹配规则,但是在规则中要加上 <category android:name="android.intent.category.DEFAULT"/>

data的匹配规则

类似与action data由两部分mimeType和URI

匹配欠要用下面检查一下:不能则返回null
public abstract List queryIntentActivities(Intent intent, int flags);

public abstract ResolveInfo resolveActivity(Intent intent , int flags);

第二个参数用MATCH_DEFAULT_ONLY,作用是,只匹配声明了<category android:name="android.intent.category.DEFAULT"/>的activity。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值