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 也可以的
在应用重启的瞬间,会有短时的白屏现象

相关推荐
前期后期2 小时前
Android OkHttp源码分析(一):为什么OkHttp的请求速度很快?为什么可以高扩展?为什么可以高并发
android·okhttp
轻口味4 小时前
Android应用性能优化
android
全职计算机毕业设计4 小时前
基于 UniApp 平台的学生闲置物品售卖小程序设计与实现
android·uni-app
dgiij5 小时前
AutoX.js向后端传输二进制数据
android·javascript·websocket·node.js·自动化
SevenUUp6 小时前
Android Manifest权限清单
android
高林雨露6 小时前
Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
android·拍照抓拍
wilanzai6 小时前
Android View 的绘制流程
android
INSBUG7 小时前
CVE-2024-21096:MySQLDump提权漏洞分析
android·adb
Mercury Random8 小时前
Qwen 个人笔记
android·笔记
苏苏码不动了8 小时前
Android 如何使用jdk命令给应用/APK重新签名。
android