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

相关推荐
stevenzqzq43 分钟前
Android Hilt 入门教程_传统写法和Hilt写法的比较
android
wuwu_q1 小时前
用通俗易懂方式,详细讲讲 Kotlin Flow 中的 map 操作符
android·开发语言·kotlin
_李小白2 小时前
【Android FrameWork】第五天:init加载RC文件
android
2501_916007472 小时前
手机使用过的痕迹能查到吗?完整查询指南与步骤
android·ios·智能手机·小程序·uni-app·iphone·webview
黄毛火烧雪下3 小时前
React Native (RN)项目在web、Android和IOS上运行
android·前端·react native
下位子3 小时前
『OpenGL学习滤镜相机』- Day7: FBO(帧缓冲对象)
android·opengl
從南走到北3 小时前
JAVA国际版同城外卖跑腿团购到店跑腿多合一APP系统源码支持Android+IOS+H5
android·java·ios·微信小程序·小程序
空白格973 小时前
组件化攻略
android
岸芷漫步3 小时前
android框架层弹出对话框的分析
android
Android疑难杂症3 小时前
鸿蒙Media Kit媒体服务开发快速指南
android·harmonyos·音视频开发