您的位置:首页 > 移动开发 > Android开发

Activity AndroidManifest的启动模式

2016-04-16 22:56 447 查看
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,排下序,并且移动到最前面来

写的有错的地方,请大家留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: