activity 的启动模式有4种: “standard” (默认模式), “singleTop”,”singleTask”,”singleInstance”
四种模式的作用:
文档中解释的 intent.setFlags 中的 Flag
测试1:manifest中未设置启动模式(即使用默认的启动模式),MainActivity一开始已经有启动
Intent intent = new Intent(TestActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("MainActivity", "abababab"); startActivity(intent);
结果:MainActivity 重新调用了onCreate()
测试2:manifest中设置了启动模式(singleTask),MainActivity一开始已经有启动
Intent intent = new Intent(TestActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("MainActivity", "abababab"); startActivity(intent);
结果:MainActivity 调用了onNewIntent()
测试3:manifest中设置了启动模式(singleTop),MainActivity启动自己
Intent intent = new Intent(MainActivity.this, MainActivity.class); intent.putExtra("MainActivity", "abababab"); startActivity(intent);
结果:MainActivity 调用了onNewIntent()
测试4:manifest中未设置启动模式(使用默认standard),MainActivity一开始已经有启动
Intent intent = new Intent(TestActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra("MainActivity", "abababab"); startActivity(intent);
结果:MainActivity 没有调用onCreate(),调用了 onNewIntent()
测试5:manifest中未设置启动模式(使用默认standard),MainActivity一开始已经有启动
Intent intent = new Intent(TestActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("MainActivity", "abababab"); startActivity(intent);
结果:MainActivity 调用onCreate(),没有调用onNewIntent()
总结
启动模式 singleTop 对应的Flag 是 Intent.Intent.FLAG_ACTIVITY_SINGLE_TOP
启动模式 singleTask 对应的Flag 是 Intent.Intent.FLAG_ACTIVITY_NEW_TASK
默认的启动模式(standard),当使用 flag为 Intent.FLAG_ACTIVITY_CLEAR_TOP 时会先将自己及以上的activity移除栈,再重新启动 该activity
当使用Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP 的时候,启动模式single top 会覆盖默认的启动模式 standard。所以在移除上面的activity 的时候会调用自己的 OnNewIntent() 而不会重新 onCreate()
当使用 Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_NEW_TASK 的时候,设置的启动模式为single task 但是当发现该activity 已经存在的时候,交给了默认的standard 处理cleartop,所以会重新onCreate() 而不会调用 onNewIntent().
这是实验结果,有什么不对的地方,请大家指出