Activity启动模式

Activity启动模式


Activity启动模式分为四种:standardsingleTopsingleTasksingleInstance。为了观察Activity在各启动模式下的生命周期,在相关文件添加相应log,代码如下 :

    public class MainActivity extends BaseActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    @OnClick(R.id.btn_launch_main)
    void launchMyself() {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        KomaLog.i(TAG, "onCreate taskId : " + getTaskId());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        KomaLog.i(TAG, "onNewIntent taskId : " + getTaskId());

        setIntent(intent);
    }

    @Override
    protected void onStart() {
        super.onStart();

        KomaLog.i(TAG, "onStart taskId : " + getTaskId());
    }

    @Override
    protected void onResume() {
        super.onResume();

        KomaLog.i(TAG, "onResume taskId : " + getTaskId());
    }

    @Override
    protected void onPause() {
        super.onPause();

        KomaLog.i(TAG, "onPause taskId : " + getTaskId());
    }

    @Override
    protected void onStop() {
        super.onStop();

        KomaLog.i(TAG, "onStop taskId : " + getTaskId());
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }
}
public class SecondActivity extends BaseActivity {
    private static final String TAG = SecondActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        KomaLog.i(TAG, "onCreate taskId : " + getTaskId());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        KomaLog.i(TAG, "onNewIntent taskId : " + getTaskId());

        setIntent(intent);
    }

    @Override
    protected void onStart() {
        super.onStart();

        KomaLog.i(TAG, "onStart taskId : " + getTaskId());
    }

    @Override
    protected void onResume() {
        super.onResume();

        KomaLog.i(TAG, "onResume taskId : " + getTaskId());
    }

    @Override
    protected void onPause() {
        super.onPause();

        KomaLog.i(TAG, "onPause taskId : " + getTaskId());
    }

    @Override
    protected void onStop() {
        super.onStop();

        KomaLog.i(TAG, "onStop taskId : " + getTaskId());
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_second;
    }
}

  • standard 标准模式

    当我们在manifest中activity标签下未指定android:launchMode时,系统默认启动模式则为standard,相当于设置android:launchMode="standard"。在这种模式下,每次启动该activity时系统都会为其创建一个实例(依次回调onCreate、onStart、onResume),不管这个实例是否已经存在。onNewIntent 方法永远不会调用,且taskId也不会改变。

  • singleTop栈顶复用模式

    • 在这种启动模式下,只要被启动的Activity不位于栈的顶部,该Activity就会被创建入栈。
      如果被启动的Activity不位于栈顶,其生命周期回调如下:

      04-04 01:18:55.234 29157 29157 I KomaLog : MainActivity----onCreate taskId : 1989
      04-04 01:18:55.236 29157 29157 I KomaLog : MainActivity----onStart taskId : 1989
      04-04 01:18:55.239 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989

      通过log 看在这种情况下,每次被启动时Activity都会重新创建,会回调onCreate,但是不会回调onNewIntent

    • 如果被启动的Activity位于栈顶,该活动的实例就不会被创建,若当前Activity未回调onStop时(当前Activity未处于停止状态),其生命周期回调如下:

      04-04 01:21:35.407 29157 29157 I KomaLog : MainActivity----onNewIntent taskId : 1989
      04-04 01:21:35.411 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989
    • 若当前Activity位于栈顶,且已回调onStop(处于停止状态),其生命周期回调如下:

      04-04 01:22:31.201 29157 29157 I KomaLog : MainActivity----onNewIntent taskId : 1989
      04-04 01:22:31.202 29157 29157 I KomaLog : MainActivity----onStart taskId : 1989
      04-04 01:22:31.204 29157 29157 I KomaLog : MainActivity----onResume taskId : 1989
  • singleTask 栈内复用模式

    • 当Actvity在栈中没有实例时,其生命周期调用如下:

      04-04 02:39:01.563 31129 31129 I KomaLog : MainActivity----onCreate taskId : 1992
      04-04 02:39:01.565 31129 31129 I KomaLog : MainActivity----onStart taskId : 1992
      04-04 02:39:01.568 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992
    • 当Activity在栈中已存在实例时,且未回调onStop(未进入停止状态时)其生命周期调用如下:

      04-04 02:44:55.691 31129 31129 I KomaLog : MainActivity----onNewIntent taskId : 1992
      04-04 02:44:55.692 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992
    • 当Activity在栈中已存在实例时,且已回调onStop(进入停止状态时)其生命周期调用如下:

      04-04 02:45:47.441 31129 31129 I KomaLog : MainActivity----onNewIntent taskId : 1992
      04-04 02:45:47.443 31129 31129 I KomaLog : MainActivity----onStart taskId : 1992
      04-04 02:45:47.444 31129 31129 I KomaLog : MainActivity----onResume taskId : 1992

      由此可见当Activity在singleTask栈内复用模式)下,只要Activity实例在一个栈中存在,那么多次启动该Activity都不会创建其实例(即不会回调onCreate);当其实例在栈中已存在时,再次启动该Activity会回调onNewIntent 方法,但是taskId是不会改变的。

  • singleInstance 单实例模式

    singleInstance单实例模式是一种增强型singleTask模式,其除了具有singleTask模式的所有特性外,还加强了一点,具有此种模式的Activity只能单独地位于一个任务栈中。onNewIntent方法的调用时机也和singleTask一样,当栈内有其实例才会调用onNewIntent,在此就不一一列出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值