2017-05-30 3 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が開始され、表示されますが、1秒間だけ表示されます。その後、アプリは完全になくなり、Androidには以前のアプリが表示されます。

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を使って試してみた:

ログファイルは、この(PIDは若干異なります注意してください)が含まれ

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はdoesnのまったく表示されず、logcatに次のような行が表示されます。

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

原因とはgのAndroidはすぐに開始されたプロセスを殺すために非常に悪いですか?

+0

** android.os.Process.killProcess **を試しましたか? –

+0

そうは思いませんが、それはしばらくしています。これは現在私の優先順位リストには載っていないので、何かを試す前に「中」の時間がかかります。ありがとう。 –

+0

** System.exit(1)**は使用しないでください。タスクスタックをクリーンアップしないので、OSにアプリケーションを正常に終了させる機会はありません。タスクスタックの詳細はこちら:https://developer.android.com/guide/components/activities/tasks-and-back-stack.html –

答えて

1

あなたがしようとしていたことを誤解したように、重い編集をしました。

保留中のインテントを自分のアプリケーションに送信しているため、最初のバージョンが機能しません。保留中の意図が新しいプロセスで実行されるわけではないという理由だけで、他のアプリケーションが呼び出すアプリケーション(通知のランチャーなど)は、自分のプロセスが意図を開始したかのようにアクティブになります。たとえば、私的活動にアクセスすることができます。あなたが殺される前にあなたのプロセスで実際に始まりました。それがあなたと共に殺されます。

アラームマネージャは、保留中のインテントがBroadcastReceiverでなければならないため、まったく機能しません。これは、サービスまたはアクティビティに受け入れられません。あなたがマニフェストにレシーバを置き、それに保留中の意図を使用すると、おそらくそれを動作させることができます。

+0

ありがとう、Gabe。だから、明らかにするために、あなたはアプリを再起動する他の方法を知らないのですか?そうでなければ、私はBroadcastReceiverを実装しようとします。 –

+0

オフハンドではありません。私がこれまでにやろうとしたことではありません。 –

+0

これまでのところ、1台のデバイスでしかテストされていないようです。質問:明らかに、セキュリティ上の理由から、受信者は手動でアプリを起動するまで無視されます。つまり、AlarmManagerがブロードキャストをトリガーしますが、アプリを少なくとも1回は実行していない限り、Androidは受信者を開始しません。デバッガからコードを実行しようとするたびに、レシーバは起動しません。自分のデバイス上のアプリケーションから選択して実行する必要があります。デバッガから動作させる方法はありますか? –

関連する問題