2017-05-30 79 views
2

我正在使用Thread.setDefaultExceptionHandler()嘗試啓動新的活動,有效地重新啓動應用程序。但是,似乎ActivityManager剛剛啓動後正在殺死新的應用程序進程。Android uncaughtException後,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顯示之前的應用程序。

日誌文件包含此(注意PID是略有不同):

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 

什麼是causin g Android非常想要殺死剛開始的進程?

+0

你有沒有嘗試過使用** android.os.Process.killProcess **? –

+0

我不這麼認爲,但已經有一段時間了。目前這並不是我的優先考慮事項,所以在我嘗試其他任何事情之前,這將是一段「時間」。謝謝。 –

+0

請勿使用** System.exit(1)**,因爲它不會清理任務堆棧,也不會讓操作系統有機會徹底退出您的應用程序。在這裏閱讀關於任務堆棧的更多信息:https://developer.android.com/guide/components/activities/tasks-and-back-stack.html –

回答

1

嚴重編輯,因爲我誤以爲你正在嘗試做什麼。

第一個版本不起作用,因爲您正在向您自己的應用程序發送掛起的意圖。僅僅因爲它的待決意圖並不意味着它會在新的過程中運行,這意味着無論其他應用程序調用它(例如通知啓動程序),它都將被激活,就像您自己的過程啓動了意圖一樣。因此,它可以訪問私人活動,例如。它實際上是在你被殺之前在你的過程中開始的,然後它會被你殺死。

警報管理器根本無法工作,因爲其中的掛起的意圖必須是廣播接收器 - 它不接受一個服務或活動。如果你在你的清單中放置一個接收器並且使用一個未決的意圖,那麼你可以使它工作。

+0

謝謝,Gabe。所以,要清楚,你沒有意識到任何其他重新啓動應用程序的方法?假設不,我會嘗試實現一個BroadcastReceiver。 –

+0

不適合。它不是我曾經嘗試過的。 –

+0

似乎工作 - 迄今爲止只在一臺設備上進行過測試。問題:顯然,出於安全原因,我的接收器將被忽略,直到我手動啓動應用程序。也就是說,AlarmManager會觸發廣播,但Android不會啓動我的接收器,除非我已經運行該應用至少一次。每次我嘗試從調試器運行我的代碼時,我的接收器都不會啓動。我必須從我的設備上的應用程序中選擇它來運行它。有沒有辦法讓它從調試器工作? –