前言
为什么要引入任务栈的概念:
windows下可以通过点击任务栏,切换任务
Android 下点击下方小方块按钮,切换任务
为了记录用户开启了那些activity,记录这些activity开启的先后顺序,google引入任务栈(task stack)概念,帮助维护系统的用户体验。
任务栈概念
任务栈,故名思义就是来管理我们开启的任务(补充说明:任务:即就是一件事情;栈:先进后出;队列:先进先出);
在我们Android中,一个应用程序有多个界面(即Activity)组成,当我们启动多个界面的时候,就需要对我们所启动的这些界面进行管理,因而引入了任务栈来管理(任务栈作用就是管理内存中的Activity实例对象,维护我们在应用程序中打开的Activity,显示在我们眼前的这个界面,永远是位于栈顶的Activity,即最后开启的那一个界面);
. 一个Android应用一但被开启,系统就给他分配一个任务栈,当所有的activity都退出的时候,任务栈就清空了;一个Android操作系统,存在多个任务栈,一个应用程序就是一个任务栈;默认情况下,关闭掉一个应用程序,清空了这个应用程序的任务栈,但这个应用程序的进程还会保留。
Activity的启动模式配置:
在manifest.xml文件中的每个activity 节点下,配置 android:launchMode="singleInstance"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Activity的启动模式之singleInstance(单例实例模式):
开启目标activity , 系统为目标activity单独创建一个任务栈 ---- 整个操作系统只有一个目标activity的实例对象 , 并且单独运行在一个任务栈中
应用场景 : 如 : 来电拨号界面
单实例的创建步骤 :
1. 私有化构造方法 ---- 不允许外界进行创建
2. 私有静态的instance对象
3. 公开的静态的getInstance方法
4. 为了线程的安全 , 需要给 getInstance方法加上锁
public class MyThreadPoolManager {
private MyThreadPoolManager() {
}
private static MyThreadPoolManager instance;
public synchronized static MyThreadPoolManager getInstance() {
if (instance == null) {
instance = new MyThreadPoolManager();
}
return instance;
}
}
Activity的启动模式之standard(标准启动模式):
打开一个应用程序 , 系统就为应用程序创建一个任务栈 . 开启目标activity , 把目标activity压入任务栈 , 使其位于任务栈的栈顶 . 点击返回时 , 从任务栈的栈顶移除一个activity
应用场景 : 绝大多数情况都是这样的 如 打开一个文本文件时
Activity的启动模式之singleTop(单一顶部模式):
开启一个目标activity , 系统去任务栈的栈顶查找有没有目标 activity的实例 , 如果有就复用activity , 如果没有就创建一个目标activity的实例对象 , 放在任务栈的栈顶
应用场景 : 系统的浏览器标签 , 从通知栏打开播放器的时候
Activity的启动模式之singleTask(单一任务模式):
开启一个目标activity , 系统去任务栈中查找有没有目标activity的实例对象 , 如果有 , 就清除目标activity上所有的实例对象 , 使其位于任务栈的栈顶 ,如果没有 , 就创建一个目标activity的实例 , 位于任务栈的栈顶
应用场景: 浏览器书签。 避免栈顶的activity被重复的创建,解决用户体验问题,节约内存和cpu