gpt4 book ai didi

android - 在 Android uncaughtException 之后,ActivityManager 会强制停止新进程

转载 作者:行者123 更新时间:2023-11-29 01:09:33 28 4
gpt4 key购买 nike

我正在使用 Thread.setDefaultExceptionHandler() 尝试启动新 Activity ,有效地重启应用程序。但是,似乎 ActivityManager 正在启动新的应用程序进程。

我已经尝试了很多实验。最成功的是这段代码,在异常处理程序中:

public void handleUncaughtException (Thread thread, Throwable e)
{
Intent intent = new Intent (getBaseContext (), RestartActivity.class);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pending =
PendingIntent.getActivity (getBaseContext (), 0, intent, PendingIntent.FLAG_ONE_SHOT);

try {
pending.send ();
}
catch (PendingIntent.CanceledException e1) {
logE ("send pending intent:" + e1); // logE is a wrapper for Log.e().
}

System.exit (1);
}

在这种情况下,RestartActivity 启动并显示,但只有一秒钟。然后该应用程序完全消失,Android 显示之前的应用程序。

日志文件包含这个(注意 pids 略有不同):

05-29 22:46:28.429 1465-3665/? I/ActivityManager: Force stopping com.perinote.crashtest appid=10170 user=0: from pid 14484
05-29 22:46:28.429 1465-3665/? I/ActivityManager: Killing 14486:com.perinote.crashtest/u0a170 (adj 0): stop com.perinote.crashtest

我也试过在这个变体中使用 AlarmManager:

public void handleUncaughtException (Thread thread, Throwable e)
{
Intent intent = new Intent (getBaseContext (), RestartActivity.class);
intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent pending =
PendingIntent.getActivity (getBaseContext (), 0, intent, PendingIntent.FLAG_ONE_SHOT);

AlarmManager alarm = (AlarmManager)getSystemService (Context.ALARM_SERVICE);
alarm.set (AlarmManager.RTC, System.currentTimeMillis () + 3000, pending);

System.exit (1);
}

在这种情况下,RestartActivity 根本不显示,我在 logcat 中看到这样一行:

05-29 22:06:46.841 1465-11842/? I/ActivityManager: Force stopping com.perinote.crashtest appid=10170 user=0: from pid 12551

是什么导致 Android 非常想杀死刚刚启动的进程?

最佳答案

由于我误会了您的 Intent ,因此进行了大量编辑。

第一个版本不起作用,因为您正在向您自己的应用程序发送待定 Intent 。仅仅因为它是一个未决的 Intent 并不意味着它将在一个新进程中运行,这意味着无论其他应用程序调用它(例如通知启动器)它都会被激活,就像您自己的进程启动了 Intent 一样。例如,它可以访问私有(private) Activity 。它实际上是在您被杀死之前在您的进程中启动的,然后与您一起被杀死。

警报管理器根本不起作用,因为其中的未决 Intent 必须是针对 BroadcastReceiver - 它不接受服务或 Activity 。如果您在 list 中放置一个接收器并对其使用待处理的 Intent ,您可能可以让它工作。

关于android - 在 Android uncaughtException 之后,ActivityManager 会强制停止新进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44254411/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com