1 四种启动模式介绍
- Standard 标准
如果任务栈默认是包名,则每次都新建一个activity;
如果任务栈是affinity来命名的,并且已经存在,则不会新建,而是执行恢复流程。 - SingleTop 栈顶复用
如果任务栈顶存在,则复用,调用onNewIntent
// 进入Activity
2019-12-12 09:50:34.121 9811-9811/com.example.learndemo D/LifeCycle: onCreate
2019-12-12 09:50:34.224 9811-9811/com.example.learndemo D/LifeCycle: onStart
2019-12-12 09:50:34.234 9811-9811/com.example.learndemo D/LifeCycle: onResume
// 栈顶已经存在Activity,再次进入Activity
2019-12-12 09:50:47.992 9811-9811/com.example.learndemo D/LifeCycle: onPause
2019-12-12 09:50:47.993 9811-9811/com.example.learndemo D/LifeCycle: onNewIntent
2019-12-12 09:50:47.994 9811-9811/com.example.learndemo D/LifeCycle: onResume
-
SingleTask 栈内复用
需要taskAffinity属性配合使用
如果任务栈内存在该Activity,则复用,并移除在其上面的Activity,调用onNewIntent -
SingleInstance 单实例
android系统Recount History描述的是当前的task个数的情况。
任务栈与进程的关系?
任务栈与进程并没有绝对的一对一关系,同一个app內,通过process属性设置多进程,默认是在同一个任务栈內(app包名)。
/**
* MainActivity是默认首页
* SecondActivity设置多进程
* ThirdActivity设置单独任务栈
*/
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:process=":second_process" />
<activity
android:name=".ThirdActivity"
android:launchMode="singleTask"
android:taskAffinity="com.example.multiprocess.third"/>
运行结果如下:
MainActivity与SecondActivity是不同进程,但是在同一个任务栈;ThirdActivity单独在另一个任务栈
zhengweideMacBook-Pro:~ zhengwei$ adb shell dumpsys activity activities|grep "Run"
Running activities (most recent first):
Run #0: ActivityRecord{3fe02d8 u0 com.example.multiprocess/.ThirdActivity t9860}
Running activities (most recent first):
Run #1: ActivityRecord{cece906 u0 com.example.multiprocess/.SecondActivity t9859}
Run #0: ActivityRecord{aec64f1 u0 com.example.multiprocess/.MainActivity t9859}
Running activities (most recent first):
Run #0: ActivityRecord{8065c4e u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}
zhengweideMacBook-Pro:~ zhengwei$
2 LaunchMode的2种设置方式如何理解?
- AndroidMenifest.xml中定义,此activity是自己开发的;
- Intent activity flag配置,是启动他人的activity。
3 经验总结
-
taskAffinity需要SingleTask / SingleInstance配合使用才会有效
-
taskAffinity+allowTaskReparenting(允许activity在各个Task中转移)
ActivityA在后台任务栈,
有其他activity进入前台,并且affinity与ActivityA相同,则自动将ActivityA添加到当前任务栈
adb shell dumpsys activity activities
- Binder数据传递大小限制问题
binder机制限制传输的数据:1M-2*4096
Linux系统内存以页为单位,一页内存为4096字节
Framework/native/libs/binder/ProcessState.cpp
#define BINDER_VM_SIZE ((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)
可以使用bundle.putBinder()的方式传递大对象