Activity启动模式

2017-11-29  本文已影响10人  pkxutao

Activity启动模式

singlTop 栈顶复用模式

如果该模式的Activity位于栈顶,则启动该Activity不会重新创建,相应的onCreat、onStart不会被调用,onNewIntent被调用

singleTask 栈内复用模式

这是一种单实例模式。只要Activity在一个栈中存在,那么多次启动Activity都不会重新创建实例,onNewIntent会被调用

Activity的Flags

FLAG_ACTIVITY_NEW_TASK

这个标记的作用是为Activity指定“singleTask”启动模式

FLAG_ACTIVITY_SINGLE_TOP

这个标记的作用是为Activity指定“singleTop”启动模式

FLAG_ACTIVITY_CLEAR_TOP

当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈

实践

在工作时,经常需要做一个“回到首页”功能,即点击一个按钮回到最初始的界面(MainActivity)。
这个功能可以通过两个flag完成:FLAG_ACTIVITY_NEW_TASK && FLAG_ACTIVITY_CLEAR_TOP。例如:一个任务栈中有ABCD四个Activity,现在需要回到A,BCD出栈,
如果现在只设置了FLAG_ACTIVITY_NEW_TASK,则任务栈变成BCDA,
如果只设置FLAG_ACTIVITY_CLEAR_TOP,任务栈会变成ABCDA,所以两者缺一不可

任务栈

参数:TaskAffinity

这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名。我们可以为每个Activity都单独指定TaskAffinity,TaskAffinity主要和singleTask启动模式或者allowTaskRepatenting属性配对使用,在其他情况下没有意义。

分类

分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调到前台,例如:所有属性默认情况下,启动一个APP,桌面Activity所在的任务栈变成后台任务栈,APP的Activity所在的任务栈变成前台任务栈

使用方法

    Intent intent = new Intent();
    intent.setClass(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    context.startActivity(intent);

或者

        <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:screenOrientation="portrait" >

setFlags和addFlags区别

其实从方法名字上就可以区分,setFlags会替换之前的flag,addFlags是在原来基础上添加flag,来看源码:

public Intent setFlags(int flags) {
    mFlags = flags;
    return this;
}
 public Intent addFlags(int flags) {
    mFlags |= flags;
    return this;
}

参考资料来自《Android开发艺术探索》

上一篇下一篇

猜你喜欢

热点阅读