问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Activity的启动模式有哪几种,分别用于什么

发布网友 发布时间:2022-04-25 20:48

我来回答

2个回答

热心网友 时间:2022-06-17 06:55

刚好最近又梳理了一下,结合我的实际使用场景回答一下= =

有四种启动模式,需要知道的是activity是交由activity栈(任务栈)管理的

standard : 会在启动时创建一个新实例入栈,所以每次打开都是一个新的界面

场景:默认模式,一般的activity用这个就好

singleTop:当启动activity时,有相同的activity在前台与用户交互,就复用这个activity,回调onNewIntent()方法,避免栈顶的activity被重复的创建;如果没在栈顶,依然会创建新的实例加在栈顶

场景:这个主要针对重复打开的情况,比如你点击通知栏,跳转到消息中心,如果此时消息中心已经打开,就不会重新打开新的界面,合乎逻辑

singleTask:类似singleTop,也是避免重复创建,唯一不同的是,当启动activity时,有相同的activity在栈内,会复用此activity,回调onIntent(),并清空此activity之上所有activity

场景:一般用于程序主界面,利用清空activity的特性,比如你在应用内,打开了多个界面,触发了某个操作后都需要跳转到首页,设置了singleTask之后,就直接启动主页就好,会把之前打开的全部关掉(免得你手动一个一个关闭activity)

singleInstance:顾名思义,单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity

场景:常见于系统呼叫来电界面,每个应用打开不会重新创建新的该拨打界面。这种模式比较少用,除非你确定需要使该Activity只有一个实例

最后,上面介绍是在默认没有指定taskAffinity的情况下(即包名),具体想要更深入或者实现更复杂的场景,请结合taskAffinty和Intent Flag具体分析,在此就不介绍了。

以上。

热心网友 时间:2022-06-17 06:55

1 standard
standard 模式是默认的启动模式,不用为<activity>配置 android:launchMode 属性即可,当然也可以指定值
为 standard。
我们将创建一个 Activity,命名为 FirstActivity,来演示一下标准的启动模式。FirstActivity 代码如下:
public class FirstActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
TextView textView = (TextView) findViewById(R.id.tv);
textView.setText(this.toString());
Button button = (Button) findViewById(R.id.bt);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,
FirstActivity.class);
startActivity(intent);
}
});
}
}
FirstActivity 界面中的 TextView 用于显示当前 Activity 实例的序列号, Button 用于跳转到下一个 FirstActivity 界面。
然后我们连续点击几次按钮,将会出现下面的现象:

我们注意到都是 FirstActivity 的实例, 但序列号不同, 并且我们需要连续按后退键两次, 才能回到第一个 FirstActivity。
standard 模式的原理如下图所示:
如图所示,每次跳转系统都会在 task 中生成一个新的 FirstActivity 实例,并且放于栈结构的顶部,当我们按下后退键
时,才能看到原来的 FirstActivity 实例。
这就是 standard 启动模式,不管有没有已存在的实例,都生成新的实例。

2 singleTop
我们在上面的基础上为<activity>指定属性 android:launchMode="singleTop",系统就会按照 singleTop 启
动模式处理跳转行为。我们重复上面几个动作,将会出现下面的现象:

我们看到这个结果跟 standard 有所不同,三个序列号是相同的,也就是说使用的都是同一个 FirstActivity 实例;
如果按一下后退键,程序立即退出,说明当前栈结构中只有一个 Activity 实例。singleTop 模式的原理如下图所示:
正如上图所示,跳转时系统会先在栈结构中寻找是否有一个 FirstActivity 实例正位于栈顶,如果有则不再生成新的,
而是直接使用。也许朋友们会有疑问,我只看到栈内只有一个 Activity,如果是多个 Activity 怎么办,如果不是在栈
顶会如何?我们接下来再通过一个示例来证实一下大家的疑问。
我们再新建一个 Activity 命名为 SecondActivity,如下:

public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
TextView textView = (TextView) findViewById(R.id.tv);
textView.setText(this.toString());
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,
FirstActivity.class);
startActivity(intent);
}
});
}
}
然后将之前的 FirstActivity 跳转代码改为:
Intent intent = new Intent(FirstActivity.this, SecondActivity.clas
s);
startActivity(intent);
这时候,FirstActivity 会跳转到 SecondActivity,SecondActivity 又会跳转到 FirstActivity。演示结果如下:

我们看到,两个 FirstActivity 的序列号是不同的,证明从 SecondActivity 跳转到 FirstActivity 时生成了新的
FirstActivity 实例。原理图如下:
我们看到,当从 SecondActivity 跳转到 FirstActivity 时,系统发现存在有 FirstActivity 实例,但不是位于栈顶,
于是重新生成一个实例。
这就是 singleTop 启动模式,如果发现有对应的 Activity 实例正位于栈顶,则重复利用,不再生成新的实例。

3 singleTask
在上面的基础上我们修改 FirstActivity 的属性 android:launchMode="singleTask"。演示的结果如下:

我们注意到,在上面的过程中,FirstActivity 的序列号是不变的,SecondActivity 的序列号却不是唯一的,说明
从 SecondActivity 跳转到 FirstActivity 时,没有生成新的实例,但是从 FirstActivity 跳转到 SecondActivity 时生成
了新的实例。singleTask 模式的原理图如下图所示:
在图中的下半部分是 SecondActivity 跳转到 FirstActivity 后的栈结构变化的结果,我们注意到,SecondActivity
消失了,没错,在这个跳转过程中系统发现有存在的 FirstActivity 实例,于是不再生成新的实例,而是将 FirstActivity
之上的 Activity 实例统统出栈, 将 FirstActivity 变为栈顶对象, 显示到幕前。 也许朋友们有疑问, 如果将 SecondActivity
也设置为 singleTask 模式,那么 SecondActivity 实例是不是可以唯一呢?在我们这个示例中是不可能的,因为每次
从 SecondActivity 跳转到 FirstActivity 时,SecondActivity 实例都*出栈,下次等 FirstActivity 跳转到SecondActivity 时,找不到存在的 SecondActivity 实例,于是必须生成新的实例。但是如果我们有 ThirdActivity,
让 SecondActivity 和 ThirdActivity 互相跳转,那么 SecondActivity 实例就可以保证唯一。
这就是 singleTask 模式,如果发现有对应的 Activity 实例,则使此 Activity 实例之上的其他 Activity 实例统统出
栈,使此 Activity 实例成为栈顶对象,显示到幕前。

4 singleInstance
这种启动模式比较特殊,因为它会启用一个新的栈结构,将 Activity 放置于这个新的栈结构中,并保证不再有其
他 Activity 实例进入。
我们修改 FirstActivity 的 launchMode="standard",SecondActivity 的 launchMode="singleInstance",由
于涉及到了多个栈结构,我们需要在每个 Activity 中显示当前栈结构的 id,所以我们为每个 Activity 添加如下代码:
TextView taskIdView = (TextView) findViewById(R.id.taskIdView);
taskIdView.setText("current task id: " + this.getTaskId());
然后我们再演示一下这个流程:

我们发现这两个 Activity 实例分别被放置在不同的栈结构中,关于 singleInstance 的原理图如下
我们看到从 FirstActivity 跳转到 SecondActivity 时,重新启用了一个新的栈结构,来放置 SecondActivity 实例,
然后按下后退键,再次回到原始栈结构;图中下半部分显示的在 SecondActivity 中再次跳转到 FirstActivity,这个时
候系统会在原始栈结构中生成一个 FirstActivity 实例, 然后回退两次, 注意, 并没有退出, 而是回到了 SecondActivity,
为什么呢?是因为从 SecondActivity 跳转到 FirstActivity 的时候,我们的起点变成了 SecondActivity 实例所在的栈
结构,这样一来,我们需要“回归”到这个栈结构。
如果我们修改 FirstActivity 的 launchMode 值为 singleTop、singleTask、singleInstance 中的任意一个,流程将会

singleInstance 启动模式可能是最复杂的一种模式,为了帮助大家理解,我举一个例子,假如我们有一个 share 应用,
其中的 ShareActivity 是入口 Activity,也是可供其他应用调用的 Activity,我们把这个 Activity 的启动模式设置为
singleInstance,然后在其他应用中调用。我们编辑 ShareActivity 的配置:
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
三七粉贵吗多少钱一斤 三七粉多少钱一斤 万达有什么app 如何避免好学生成为心态受害者? 为什么好学生心态会害了自己呢? 好学生心态受害者是怎样一种存在? 好学生心态有什么影响? 好学生心态受害者是指什么意思? “好学生心态受害者”是指哪些人? 好学生心态受害者是指谁呢? 好学生心态受害者是指什么人? 有LOL“第一美男”称号的欧城,现如今为何看着像50岁抠脚大汉? 网恋这回事,你怎么看? 女生发调皮]中有坏笑咋回复 八岁的甜馨遭网暴,长见识教育被扭曲,国民女儿到底得罪了谁? 女孩在微信说“亲”又发三个大笑表情符什么意思? 英雄联盟里总说的弟弟救我是什么梗? “邓超这两个表情我能笑十年”上了热搜,《创4》现场到底发生了什么? 产出儿什么意思 经常看见易烊千玺粉丝说产出儿 女生说先打钱后发个吃瓜表情什么意思? 吴倩这么漂亮怎么就红不了? 杨幂跟谁聊得这么嗨镜头前还抠脚?你觉得哪一个明星的睡姿吃相最放飞呢? 我是个男的,我今天和我女同桌聊天,她发了个抠鼻的表情,我说她是抠鼻大汉,她说我也是抠脚大汉,我我真 一个白色小人的表情猥琐夸张 抠脚 头发飞起来 桂林有什么好处的小吃推荐吗? 微信表情抠脚的含义 桂林的饮食特点是什么? 抽烟让我的牙齿都发黄了,除了上医院还有其他办法把这黄色去除吗??? 抽烟把牙齿抽黄了,怎么弄白? 抽烟吧牙齿变黄了怎么办? 牙齿抽烟抽黄了。已经把烟戒掉了。牙齿可以洗白吗?去哪洗? 如何获取当前正在运行的Activity实例 Activity具体是怎么创建的?又是怎么显示出来的 activity的启动模式有哪些 请教高人,能说下activity四种启动模式的应用场景吗 android 如何获取手机当前的Activity实例 如何在另外一个类里面获得某个activity的实例 如何保证Activity实例个数唯一(Activity启动模式) 用文字简述怎样实现开机启动应用程序中的某个activity Activity四种启动模式有哪些? android fragment和activity的区别 service怎么得到绑定的activity实例 安卓怎么在自定义控件中获取所在activity的实例 android的activity之间可以传递对象或者集合吗请写写例子 安卓开发,请给个由一个按钮触发另一个activity的简单例子让我学习学习! 如何获取当前运行的屏幕的activity的实例对象 android activity单实例化什么意思? 怎么保存activity实例,不用刷新 如何获取activity的实例对象。要获得实例对象。不是Activity名称。 流月小限是在流年小限位上起正月是逆轮还是顺轮? 八字如何断大运流年流月与命局作用关系的原则和分析技巧