2016-10-31 6 views
1

特定の状況では、アプリケーションでexit()に電話する必要があります(これは最善の方法ではありませんが、これは問題ではありません)。また、クラッシュについてユーザーに知らせる新しいダイアログを表示したい。新しいアクティビティが起動しない場合があります

新しい放送受信機である新しいアクティビティクラスを作成し、それをマニフェストに登録しました。次に、私が呼ん:

Intent intent = new Intent(this, AppCloseReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
try 
{ 
    pendingIntent.send(); 
} 
catch(Exception ex){} 

System.exit(0); 

問題は、新しいウィンドウが時々を表示されていることです!最初に、新しいアクティビティを開始する前にSystem.exit(0);が起動すると思います(非同期呼び出しのため、ドキュメントでこれを見つけることができませんでした)ので、pendingIntent.send();System.exit(0);の間にThread.sleep(1000)を追加しましたが、結果は同じ - 新しいウィンドウが表示される。ログには何もありません。例外もありません。

新しいアクティビティは単なる静的テキストです。

+0

これは絶対に信頼できるものではありません。 'System.exit() 'を呼び出すと、基本的にVMがシャットダウンされます。 VMをシャットダウンしたときに何か起こることを保証することはできません。あなたは確かに何かがUIに表示されることは期待できません。ユースケースについて説明してください。代替案を提案することもできます。 –

+0

私のユースケースは、特定の条件下で「終了」して、アプリケーションがなぜ停止したのかをユーザに伝えることです。代わりに、私は通知を使用していますが、私は画面にとどまり、ユーザーが手動で閉じるまで待機する必要がある、より永続的な解決策が必要です。 – nikitablack

答えて

1

これは信頼できません。 VMをシャットダウンすると、VMが実行されなくなるため、何も表示できなくなります。これを行う確実な方法は、BroadcastReceiverActivityが異なるOSプロセスで実行され、メッセージが表示されるようにすることだけです。例外の性質によっては、既存のVMが他のコンポーネントを起動できない可能性がありますが、おそらく現在の実装よりも信頼性が高いため、100%信頼できるわけではありません。たとえば、アプリがOutOfMemoryExceptionのためにクラッシュした場合、おそらく何か役に立つことはできません。

これらのコンポーネントのマニフェストに<activity><receiver>定義に

android:process=":other" 

を追加し、コンポーネントが別のプロセスで実行されることを確実にします。

また、VMにダイアログの起動を実際に開始する機会を与えるために、呼び出しをSystem.exit()に遅らそうとする必要があります。また、PendingIntentを使用する必要はありません。

Intent intent = new Intent(this, AppCloseReceiver.class); 
sendBrodcast(intent); 
// Start separate Thread to terminate the process 
new Thread(new Runnable() { 
    @override 
    public void run() { 
     SystemClock.sleep(1000); // Sleep a bit to give the VM enough time to actually send the broadcast Intent 
     System.exit(0); 
    } 
}).start(); 
関連する問題