Activity的启动模式

本文深入解析了Android中Activity的四种启动模式:standard、singleTop、singleTask和singleInstance,并介绍了IntentFlag的作用及IntentFilter的匹配规则。

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

activity的LaunchMode

activity的launchmode有四种模式,分别是standard,singleTop,singleTask,singleInstance。

1.standrad 是正常模式,系统默认选项,一个任务栈可以有多个实例,每次新打开一个实例是都会重新new 一个新的实例。
2.singleTop 是栈顶复用模式,例如现在有4个activity ABCD 如果下一个打开的类是D的话 不会在重新建立一个类D ABCDD 而是复用原来的类 栈内的情况就是ABCD。
3.singleTask 栈内复用模式。在这种模式下 在同一个栈内 只会存在一个唯一的实例,多次重新启动会调用onNewIntent方法 在调用标记了singleTask的类的时候会使该类直接到栈顶,(那在这个类上面的类就会被挤出栈而进行销毁)例如
ABCD四个类 B类是launchmode为singleTask的类从D到B的话如果在不同情况下回事ABCDB 而现在是AB CD两个类会被挤出栈。

TaskAffinity 可以翻译为任务相关性,默认情况下所有activity的TaskAffinity的值都是应用的包名
而当需要一个新的栈的时候,就需要为TaskAffinity命名并且不能和包名相等,否则相当于没有使用,TaskAffinity主要和singleTask和allowTaskReparenting属性搭配使用,否者在其他情况下没有意义。

4.singleInstance 单实例模式。这是一种加强的singleTask模式,除了具有singleTask的所有特性外,还加强了一点,那就是具有此种模式的Activity只能单独第位于一个任务栈中,换句话说就是如果A类的模式是singleInstance 那启动时就会创建一个新的任务栈,而且里面只有这一个类,由于栈内复用的特性,后续的请求均不会创建新的类直到这个A类被销毁。

//launchmode可以用过两种模式为activity设置。
 <activity android:name="com.example.demo.Launch_activity"
            android:launchMode="singleTask" >

        Intent intent = new Intent();
        intent.setClass(UpdataPasswordActivity.this, LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);

两种模式都可以为acticity指定启动模式,但是还是有区别的,首先在优先级上第二种的优先级要高一些,其次第一种无法为acticity设置FLAG_ACTIVITY_CLEAR_TOP
而第二种模式无法为activity设置singleInstance模式。

Activity的 Flags

1.FLAG_ACTIVITY_NEW_TASK与singleTask相同
2.FLAG_ACTIVITY_SINGLE_TOP与singleTop相同
3.FLAG_ACTIVITY_CLEAR_TOP在同一个栈内他会直接把位于他之上的Activity都挤出栈 比如 ABCDE
E到B B有此启动模式的Activity 则会变成AB 其余Activity会被系统销毁。(在同一栈内)
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS具有这个标记的Activity不会再次出现在历史Activity的列表中。

IntentFilter的匹配规则

1.action 无论在activity中有几条action 只要有一条相同就可以进行匹配跳转。
action区分大小写,大小写不同的字符串相同的action会匹配失败。

2.category 与action不同,A想要通过隐性的跳转方式跳到B 那么如果在B中的IntentFilter有两个category那么A 如果要匹配category的话就也需要两个 并且与B中的相同才会成功,(所以要么全写要么不写,只通过action进行匹配)
(提示,在IntentFilter中必要要写cetegory )<category android:name="android.intent.category.DEFAULT"/>这是一个默认的系统匹配规则
在发起隐性跳转的时候系统会为category默认发出android.intent.category.DEFAULT这个进行匹配 所在在写IntentFilter是要写这个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值