Activity 的启动模式在Manifest.xml 配置的
查询栈的命令 adb shell dumpsys actvitiy activities
查询到运行的system service后,就可以在dumpsys后面加上service的名字,查看指定的service信息。
adb shell dumpsys activity
adb shell dumpsys cpuinfo
adb shell dumpsys battery
adb shell dumpsys window(最后部分可以看到分辨率的信息)
有些service能够接收额外的参数,我们可以使用-h查看帮助信息。
adb shell dumpsys package -h
adb shell dumpsys activity -h
activity标签里面属性
android:launchMode=”” 有4种加载模式 standard 、singleTop、singleTask、singleInstance
据结构的特性是先进后出 (First In Last Out)
不明白的就可以理解成平时乘坐电梯一样(Last In First Out)
标准模式,系统默认的模式
A启动B,B就会加入A的栈的,每次启动一个activity 都会在栈里创建新的activity实例
每个activity可以加入在不同的栈中
```
Running activities (most recent first):
TaskRecord{52975f24 #6 A=com.framework U=0 sz=8}
Run #7: ActivityRecord{52a217f4 u0 com.framework/.ui.activity.FirstActivity t6}
Run #6: ActivityRecord{52a0fab0 u0 com.framework/.ui.activity.TwoActivity t6}
Run #5: ActivityRecord{52a70cc8 u0 com.framework/.ui.activity.FirstActivity t6}
Run #4: ActivityRecord{52a4ffe0 u0 com.framework/.ui.activity.TwoActivity t6}
Run #3: ActivityRecord{5295d57c u0 com.framework/.ui.activity.FirstActivity t6}
Run #2: ActivityRecord{52955b30 u0 com.framework/.ui.activity.TwoActivity t6}
Run #1: ActivityRecord{52920484 u0 com.framework/.ui.activity.FirstActivity t6}
Run #0: ActivityRecord{52907938 u0 com.framework/.ui.activity.MainActivity t6}
就是多实例模式,MainActivity —> F —>T —->F—>T
实例都是新创建
Main(standard)---First(standard)--Two(singleTop在栈顶)--Two(singleTop)
栈顶复用,通过M-跳-F-跳-T-跳-T
Running activities (most recent first):
TaskRecord{52a27348 #10 A=com.framework U=0 sz=3}
Run #2: ActivityRecord{52a5e528 u0 com.framework/.ui.activity.TwoActivity t10}
Run #1: ActivityRecord{52908d6c u0 com.framework/.ui.activity.FirstActivity t10}
Run #0: ActivityRecord{52a24fd8 u0 com.framework/.ui.activity.MainActivity t10}
mResumedActivity: ActivityRecord{52a5e528 u0 com.framework/.ui.activity.TwoActivity t10}
当重用Activity不会重新执行activity的生命周期, 会回调onNewIntent 方法,如果activity被kill掉,不会再调用onNewIntent,一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法
使用场景:
1,QQ一次性推送10条消息,肯定也是只打开一个,不可能打开多个
2,现在是activityA,通知栏收到推送消息,打开消息内容,是要启动activityA 这个模式就起作用了
如果还有其他的使用场景,请大家留言,我好补充上
singleTask 和singleTop 一样,唯一的区别就是singleTop 是查找顶部的是否存在,singleTask是查找整个栈中的activity中是否存在,A,B,C,D,执行顺序,在从D到B,B如果存在,B上面的CD会finish(),之后回调B的onNewIntent方法,如果B不存则创建B
如果是其他程序调用以singleTask启动,要开启新的如任务栈。
接下来就是 【A,B】前台任务,B 跳转到 C 。【C,D】(singleTask模式)都在后台任务栈中,现在的栈就是C,D,B,A,处于singleTask都会被切换到前台栈中
A - B - C - D ,D跳转B,B如果是标准模式,B会重新创建,要B不重新创建,在加设置一个FLAG_ACTIVITY_SINGLE_TOP,意思就是B以及在顶部了,在使用singleTop模式。
使用场景:
1,首页-列表-详情 详情如果要跳转到首页,就使用singleTask
2,首页-选择城市-城市二级-城市三级 三级跳转到选择开始城市singleTask
3,浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
如果大家有什么经典场景,请大家留言,我好补充上
singleInstance 有singleTask 一样的特性,还有设置了singleInstance的activity会单独启动一个任务栈,而且一个栈里面只存一个实例
Running activities (most recent first):
TaskRecord{52a1ee4c #12 A=com.framework U=0 sz=1}
Run #2: ActivityRecord{52912f90 u0 com.framework/.ui.activity.TwoActivity t12}
TaskRecord{529887f8 #11 A=com.framework U=0 sz=2}
Run #1: ActivityRecord{52908d6c u0 com.framework/.ui.activity.FirstActivity t11}
Run #0: ActivityRecord{529075e8 u0 com.framework/.ui.activity.MainActivity t11}
使用场景:
1,来电界面
摘要网上 ,singleInstance适合需要与程序分离开的页面。
例如闹铃提醒,将闹铃提醒与闹铃设置分离。
singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
如果大家有什么经典场景,请大家留言,我好补充上
Intent FLAG_ACTIVITY_REORDER_TO_FRONT 场景
如果已经启动了四个Activity:A,B,C和D,在D Activity里,想再启动一个Actvity B,但不变成A,B,C,D,B,而是希望是A,C,D,B
使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,排下序,并且移动到最前面来
写的有错的地方,请大家留言。