Android-Activity的启动模式

standard:标准模式

每次都会创建新的实例

适用于一般页面

singleTop:栈顶复用模式

如果目标Activity在栈顶,则不新建,调用原有的onNewIntent()方法;
如果目标Activity不在栈顶,则新建

适用于聊天页面

singleTask:栈内复用模式

如果目标Activity在栈内存在,则不新建,调用原有的onNewIntent()方法;
如果目标Activity在栈内不存在,则新建

适用于应用主页

singleInstance:单实例模式

如果目标Activity存在,则不新建,调用原有的onNewIntent()方法;
如果目标Activity在不存在,则新建

适用于浏览器页面
此种模式的Activity在一个新的任务栈中,且该任务栈只有它。

特别提示:如果在一个singleTop或singleInstance的ActivityA中,通过startActivityForResult()方法来启动另一个ActivityB,则系统将直接返回Activity.RESULT_CANCELED而不再等待。

系统Activity栈分析

使用shell命令查看当前的任务栈信息:

adb shell dumpsys activity activities

打印信息如下:

ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
……

Running activities (most recent first):

TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
Run #7: ActivityRecord{4279d2d8 u0 com.iderzheng/.SingleTopActivity t25}
TaskRecord{429e9558 #24 A=com.iderzheng U=0 sz=1}
Run #6: ActivityRecord{429d5408 u0 com.iderzheng/.SingleInstanceActivity t24}
TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5}
Run #5: ActivityRecord{434c2238 u0 com.iderzheng/.StandardActivity t25}
Run #4: ActivityRecord{42e9e8f8 u0 com.iderzheng/.SingleTopActivity t25}
Run #3: ActivityRecord{42bffdf0 u0 com.iderzheng/.StandardActivity t25}
Run #2: ActivityRecord{42a7e160 u0 com.iderzheng/.SingleTaskActivity t25}
TaskRecord{4282e508 #23 A=com.iderzheng U=0 sz=2}
Run #1: ActivityRecord{429655d8 u0 com.iderzheng/.StandardActivity t23}
Run #0: ActivityRecord{429564e0 u0 com.iderzheng/.MainActivity t23}
… … … …

打印信息很多,这里只需要查看ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) –》Running activities (most recent first)即可。
这里有几个TaskRecord即表示有几个Activity栈。

自定义Activity栈

有时候,产品可能会提出一些比较奇怪的页面跳转逻辑,这个时候,光靠系统自带的任务栈,可能就比较麻烦了,所以不妨自定义一个任务栈吧(以下仅为模板,具体的出栈和入栈逻辑,可以在BaseApplication的进出栈方法中进行具体处理)

在BaseApplication中定义栈

public class BaseApplication extends Application {

    private static Stack<Activity> activityStack;
    private static BaseApplication singleton;

    @Override
    public void onCreate() {
        super.onCreate();
        init();
    }

    private void init() {
        singleton = this;
        activityStack = new Stack<>();
    }

    public static BaseApplication getContext() {
        return singleton;
    }

    //添加Activity到栈
    public void addActivity(Activity activity) {
        activityStack.add(activity);
    }

    //结束指定的Activity
    public void finishActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity.finish();
            activity = null;
        }
    }

    //结束所有Activity
    public void finishAllActivity() {
        for (int i = 0, size = activityStack.size(); i < size; i++) {
            if (null != activityStack.get(i)) {
                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

}

在BaseActivity中入栈和出栈

public class BaseActivity extends FragmentActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BaseApplication.getContext().addActivity(this);
    }

    public void onDestroy() {
        super.onDestroy();
        BaseApplication.getContext().finishActivity(this);
    }

}

你可能感兴趣的:(Android-Activity的启动模式)