Android 进程重启问题 android.os.Process.killProcess()

文章讨论了如何在Android应用中使用`Intent.FLAG_ACTIVITY_CLEAR_TASK`清除任务栈并在重启时指定Activity。通过`Process.killProcess()`模拟意外关闭,确保新打开的Activity成为任务栈唯一项,但可能导致短暂的白屏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局任务栈内有超过一个以上的 Activity 实例

此时,调用 Process.killProcess(Process.myPid())后,系统表现,类似“意外关闭”会重建关闭页面的前一个 Activity

清除所有任务栈并开启新进程打开指定 Activity

  • 实现代码
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() 源码:
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()源码:
// 将指定 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 实现
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 也可以的

在应用重启的瞬间,会有短时的白屏现象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值