活动的四大启动模式
活动即「activity」对于 Android 应用来说,有着不可剥离的作用,对于初学者一般来说,都只是使用了默认(standard)模式,不管发生什么情况,只要需要活动跳转,就直接新建出一个活动,随着项目越写越复杂,活动也越写越多,反复的切换活动不仅给内存带来了负担,更是给用户带来了极大的不便。
活动「activity」四大启动模式
- standard、
- singleTop、
- singleTask、
- singleInstance
本篇博客主要以文字叙述加 GIF 动图的方式讲解,尽量让篇幅间断方便理解,最后会在文墨附上 测试 Demo 代码
standard
standard 作为四大启动模式中,最最最基本的一种,这里就不过多唠叨了它的特点很明显
- 每次调用 startActivity() 建立一个活动时如果之前没建立过,则调用 onCreate 建立
- 如果之前建立过,在栈内,则还是调用 onCreate() 建立
- 如果上一个活动就是你要建立这个类型的 Activity 则还是调用 OnCreate 去建立 Activity
在 Mainfest.xml 里添加:
<activity android:name=".standard.StandardActivity" android:launchMode="standard" >
实例:
可以看到,每次点击不管之前是否存在,建立一个新的,点击返回 调用 finish()
singleTop
singleTop 字如其名,每次点击新建时,判断栈顶是否为这个 activity 的实例,如果是,则复用该活动的实例
- 过程 调用 startActivity() 打算进入一个活动
- 先检查活动栈的顶部是否是这个我活动的实例
- 如果不是 则和 standard 一样,new 一个
- 如果是,则 复用 这个活动实例
在 Mainfest.xml 里添加:
<activity android:name=".singletop.SingleTopActivity" android:launchMode="singleTop">
实例:
日志输出:
可以看出 该活动只是被暂停,然后又调用了 onResume 激活,并没有调用 onCreate 建立新的
singleTask
singleTask 顾名思义,就是栈中只有一个该 activity 对象。
流程
- 在调用 startActivity() 的时候,
- 如果栈内有这个 Activity 的实例,就将它上面的活动弹出栈外,在复用它
- 如果栈内不存在它的实例,就去创建一个新的
在 Mainfest.xml 里添加:
<activity android:name=".singleTask.SingleTaskActivity" android:launchMode="singleTask" >
实例:
可以看到,在栈顶时,如果要创建自身的实例,则直接复用,到了下个 activity 时,如果在创建这个实例,就会让当前这个实例(让栈内 位于被复用活动之上的所有活动都出栈 )finish() 掉
singleInstance
singleInstance 这种模式比较特殊,他的意思是,整个系统内(当前手机运行状态下,可能有多个 app 在运行),只能又一个这种 活动 的实例,我举个例子
- 有两个 app ,一个 appA 里有一个叫做 ActivitySingleInstance 的活动,
- 另一个 appB 它里面没有这个活动,但是可以通过路径打开这个活动
- 这时,首先在 appA 里打开这个活动 ActivitySingleInstance
- 然后在 appB 中,通过路径也打开这个活动
- 这时 appB 就会把活动从 appA 中调到 appB 里去而不会新建一个 ActivitySingleInstance 活动
在 Mainfest.xml 里添加:
<activity android:name=".singleinstance.SingleInstanceActivity" android:launchMode="singleInstance" >
跳转方法:
在 singleInstance 代码如下:
public class ActivitySingleInstance extends BaseActivity {
private SimpleDateFormat df;
private Date date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_single_instance);
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
date = new Date();
Button button = findViewById(R.id.btn_other);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(ActivitySingleInstance.this,
SinglleOtherActivity.class));
}
});
}
@Override
protected void onStart() {
Toast.makeText(this, df.format(date), Toast.LENGTH_SHORT).show();
super.onStart();
}
}
<application
...
<!-- 配置属性如下: -->
<activity
android:name=".singleInstance.ActivitySingleInstance"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="com.castiel.demo.singleinstance" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
...
</application>
另一个活动中跳转方法:
Intent intent = new Intent();
intent.setAction("com.entry.android_activity_boot_mode.singleInstance.ActivitySingleInstance");
startActivity(intent);
然而并没有结束
细心的同学会发现我们从(appA)的 ActivitySingleInstance 跳转到下一个活动后,在返回直接返回到首页,而不是 ActivitySingleInstance !这是为什么呢?这是因为,ActivitySingleInstance 被建立时,会被放到一个新的任务栈里,所以根其他的活动不在一块,才有这个效果。
好了,活动「activity」四大启动模式的启动模式基本就这些,为了减少篇幅,防止大家阅读困难,我就没这么粘代码,所有的源码都在这里,有心去的同学可以看看 -》 点击跳转 https://github.com/FishInWater-1999/android_activity_boot_mode
如果我的总结对你也有帮助,不妨点个赞支持一下的啦~ 么么哒~~