我正在使用Thread.setDefaultExceptionHandler()尝试启动新活动,有效地重新启动应用程序。但是,似乎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如此糟糕地想杀死刚刚开始的进程?
答案 0 :(得分:1)
我误解了你想要做的事情。
第一个版本不起作用,因为您正在向自己的应用程序发送待处理的意图。仅仅因为它的待定意图并不意味着它将在新进程中运行,这意味着无论其他任何应用程序调用它(例如通知的启动程序),它都将被激活,就好像您自己的进程启动了意图一样。例如,它可以访问私人活动。它实际上是在你被杀之前开始的,然后就会被你杀死。
警报管理器完全不起作用,因为它中的未决意图必须是BroadcastReceiver-它不接受服务或活动。如果你在清单中放置一个接收器并使用一个未决的意图,你可以让它工作。