高端网站搭建公司专业动漫如何制作
ActivityRecord、TaskRecord、ActivityStack区别
-  
ActivityRecord对应着一个Activity实例,保存了Activity所有相关信息
 -  
TaskRecord指的是一个任务栈,里面包含多个ActivityRecord
 -  
ActivityStack用于管理TaskRecord
 
五种启动模式
Standard模式
-  
默认的启动模式,每次启动都会创建新的Activity,运行在启动它的任务栈里
 -  
taskAffinity:对其无效
 
SingleTop模式
-  
如果当前任务栈顶部已经有一个Activity了,则不会重新创建,调用它的onNewIntent方法
 -  
例如:用于展示通知消息内容的Activity设置为SingleTop,如果当前已经在展示通知消息界面了,则不会重新创建,而是调用onNewIntent去更新界面内容
 -  
taskAffinity:对其无效
 
SingleTask模式
-  
启动时会先检查taskAffinity是否和当前任务栈一致(默认是包名),如果不一致会检查是否有同名的任务栈,如果没有就会创建一个新的与taskAffinity同名的任务栈再创建Activity;如果配置的任务栈中已经存在该Activity,则不重新创建,而是调用onNewIntent,并且它上层的Activity会都被清空
 -  
taskAffinity:只能运行在它配置的任务栈中
 -  
同时默认带
Intent.FLAG_ACTIVITY_SINGLE_TOP和## Intent.FLAG_ACTIVITY_NEW_TASK效果 
SingleInstance模式
-  
全局只有一个Activity实例,独占一个任务栈,其他Activity不能进入它所在任务栈,当重新启动该Activity时回调onNewIntent方法
 -  
配置taskAffinity和
Intent.FLAG_ACTIVITY_SINGLE_TOP和## Intent.FLAG_ACTIVITY_NEW_TASK对它都没什么意义,因为它总是独占一个任务栈并且全局唯一 
SingleInstancePerTask模式
-  
Android 12新增,同时拥有SingleInstance和SingleTask部分特性
 -  
只能作为任务栈的根Activity、作为创建该任务栈的第一个Activity运行
 -  
每个任务栈最多仅有一个实例
 -  
如果当前任务栈没有该Activity实例,则会像SingleInstance一样在新的任务栈启动该Activity
 -  
如果当前任务栈已经有该Activity实例,则不会重新创建,并会像SingleTask那样清空它上面的Activity
 -  
如果配合
Intent.FLAG_ACTIVITY_MULTIPLE_TASK或者FLAG_ACTIVITY_NEW_DOCUMENT启动时,就算当前任务栈已经有该Activity实例了,每次都会在新的任务栈中创建Activity实例 -  
Intent.FLAG_ACTIVITY_NEW_TASK和taskAffinity对这个启动模式没有意义,因为它必须在当前任务栈启动的第一个Activity,所以当前任务栈一定跟它的taskAffinity一致,所以加上或者不加上Intent.FLAG_ACTIVITY_NEW_TASK都会复用当前任务栈中的实例 -  
适用于需要在独立的任务栈启动并且拥有SingleTask特性的Activity
 
taskAffinity
-  
用于指定Activity所在的任务栈
 -  
需要配合Intent.FLAG_ACTIVITY_NEW_TASK使用,在启动时会检查是否已经存在taskAffinity同名的任务栈,不存在则会创建
 -  
仅对SingleTask有效
 
allowTaskReparenting
-  
与taskAffinity配合使用,当Activity检测到自己需要的任务栈已经创建,则会移动到taskAffinity指定的任务栈中去
 -  
使用场景:当AppA启动AppB的ActivityA时,ActivityA是先存在于AppA任务栈中的,当AppB启动时,ActivityA发现它原本需要的任务栈已经创建,则会移动到AppB任务栈中,所以我们会看到AppB启动时看到的不是主界面,而是ActivityA界面
 
其他
-  
Android 12 以前,当我们处于 Root Activity 时,点击返回键时,应用返回桌面, Activity 执行 onDestroy,程序结束。 Android 12 起同样场景下 Activity 只会 onStop,不再执行 onDestroy。
 -  
如果默认启动的Activity设置启动模式为SingleTask或者SingleInstance:打开app,进入第二个界面;返回桌面,重新回到app,显示的是主界面而不是回到桌面前的第二个界面,SingleTask模式是因为启动时会清空上层Activity;而SingleInstance独占一个任务栈,二级界面所在任务栈被切换都后台了
 -  
在cmd下运行
adb shell dumpsys activity查看Activity栈信息 -  
启动模式对应的Int值:
public class ActivityInfo extends ComponentInfo implements Parcelable {public static final int LAUNCH_MULTIPLE = 0;public static final int LAUNCH_SINGLE_TOP = 1;public static final int LAUNCH_SINGLE_TASK = 2;public static final int LAUNCH_SINGLE_INSTANCE = 3;public static final int LAUNCH_SINGLE_INSTANCE_PER_TASK = 4; 
