Activity AndroidManifest的启动模式

    • standard
    • singleTop
    • singleTask
    • singleInstance

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)

standard

标准模式,系统默认的模式
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
实例都是新创建

singleTop

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

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

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,排下序,并且移动到最前面来

写的有错的地方,请大家留言。

你可能感兴趣的:(android,栈)