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

全局任务栈内有超过一个以上的 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 也可以的
在应用重启的瞬间,会有短时的白屏现象

相关推荐
三少爷的鞋22 分钟前
为什么 Google 不再推荐 SharedPreferences?答案其实只有一个:锁
android
JMchen12334 分钟前
企业级图表组件库完整实现
android·java·经验分享·笔记·canvas·android-studio
草明9 小时前
android 蓝牙连接-兼容旧版本
android
鹏多多.9 小时前
Flutter使用screenshot进行截屏和截长图以及分享保存的全流程指南
android·前端·flutter·ios·前端框架
Flywith2412 小时前
【每日一技】Warp Workflow 使用示例
android·前端
冬奇Lab12 小时前
JobScheduler与WorkManager:任务调度机制
android·源码阅读
summerkissyou198714 小时前
Android-view-绘制流程及自定义例子
android·app
常利兵14 小时前
Android “解锁”屏幕方向:APP适配新征程
android·gitee
红藕香残玉簟秋16 小时前
【安卓学习】配置开发环境
android·学习