全局任务栈内有超过一个以上的 Activity 实例
此时,调用 Process.killProcess(Process.myPid())
后,系统表现,类似"意外关闭"会重建关闭页面的前一个 Activity
清除所有任务栈并开启新进程打开指定 Activity
- 实现代码
kotlin
fun restartLauncher() {
val intent = Intent.makeRestartActivityTask(ComponentName(MyApplication.instance.applicationContext, LauncherActivity::class.java))
// intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
MyApplication.instance.startActivity(intent)
Process.killProcess(Process.myPid())
}
Intent.makeRestartActivityTask()
源码:
java
public static Intent makeRestartActivityTask(ComponentName mainActivity) {
Intent intent = makeMainActivity(mainActivity);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
return intent;
}
Intent.FLAG_ACTIVITY_CLEAR_TASK 是一个标志符,用于启动一个新的Activity时清除之前所有的Activity任务栈。当设置了该标志符后,启动新的Activity时会清除之前所有Activity任务栈中的所有Activity,使得新启动的Activity成为任务栈中唯一的Activity。
Intent#makeMainActivity()
源码:
java
// 将指定 activity,设置成 launcher intent
public static Intent makeMainActivity(ComponentName mainActivity) {
Intent intent = new Intent(ACTION_MAIN);
intent.setComponent(mainActivity);
intent.addCategory(CATEGORY_LAUNCHER);
return intent;
}
在指定 Activity 中可以输入
Process.myPid()
日志。 发现 pid 是变化的
- 自定义 Intent 实现
kotlin
fun restartLauncher() {
val intent = Intent(MyApplication.instance.applicationContext, LauncherActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
MyApplication.instance.startActivity(intent)
Process.killProcess(Process.myPid())
}
指定打开的
Activity
不是launcher intent
也可以的
在应用重启的瞬间,会有短时的白屏现象