uncaughtExceptionHandlerでキャッチされない例外が発生した後、暗黙のインテントでアクティビティを開始しようとしました。その意図は、クラッシュした同じアプリ内のダイアログとしてアクティビティを開始する必要があります。 Need to handle uncaught exception and send log fileキャッチされていない例外の後にダイアログを表示
が、私はこのように、私自身のハンドラ・プロシージャの最後に元たuncaughtExceptionHandlerを呼び出す:これは、このスレッドに記載されている例に対応し、
public class ThisApplication extends Application
{
Thread.UncaughtExceptionHandler originalUncaughtExceptionHandler;
@Override
public void onCreate()
{
originalUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
super.onCreate();
}
public void handleUncaughtException (Thread thread, Throwable e)
{
e.printStackTrace();
Intent intent = new Intent();
intent.setAction ("de.mydomain.myapp.action.PROCESS_LOG");
intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(getPackageManager()) == null) {
Log.d("ThisApplication","No receiver");
} else {
Log.d("ThisApplication", "Intent start");
startActivity(intent);
}
originalUncaughtExceptionHandler.uncaughtException(thread, e);
}
}
結果はその後例外として、 "残念なことにApp xxxが閉じられました"のような標準ダイアログが表示されます。そのダイアログの背後には、バックグラウンドで、私はこのインテント "PROCESS_LOG"で開始すべきダイアログを見ることができます。だから明らかに始まったのですが、問題は、標準のDialogが閉じられた後、私のカスタムダイアログも閉じられることです。私は、ダイアログ活動のマニフェストに
android:launchMode="singleInstance"
を追加した場合、ダイアログは、あまりにも、隠されているが、アプリは、最近のアプリのメニューから選択された場合は、再度起動することができます。これは、ダイアログが以前のアプリケーションのプロセス/タスクとは完全に独立して開始されていないかのように思えます。
誰かが私が間違っていたと言うことができますか?
このダイアログ活動のマニフェスト一部です:
<activity
android:name=".ProcessLogActivity"
android:windowSoftInputMode="stateHidden"
android:theme="@style/ProcessLogActivity"
android:process=":report_process"
>
<intent-filter>
<action android:name="de.mydomain.myapp.action.PROCESS_LOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
対応するスタイル:
<style name="ProcessLogActivity" parent="@style/Theme.AppCompat.Light.Dialog">
</style>
これは、ダイアログActivityクラスです:
public class ProcessLogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature (Window.FEATURE_NO_TITLE);
setFinishOnTouchOutside (false);
Log.d("ThisApplication", "Intent received");
setContentView(R.layout.activity_process_log);
}
}
ACRAに接続するだけでよいでしょう。それ以外の場合は、ACRAの実装を見て、ACRAの実装方法を決定します。未処理の例外時にこのようなことをするのは、環境がかなり壊れている可能性があるため(たとえば、「OutOfMemoryError」がクラッシュを引き起こしたものなど)、正しく処理するのは難しいです。 – CommonsWare
ありがとうございます。私はACRAを見ていきます。それにもかかわらず、私は本当になぜそれがうまくいかないのか興味があります。しかし、私は自分自身でスローされた例外を使ってテストしました。最初はこのシナリオをテストするための単純な "空の" RuntimeExceptionです。 – Harry500
ACRAでは、レポートデータを表示するためのダイアログとして表示されるカスタムダイアログ(Fregment)やアクティビティを表示したり、レポートを保存するなどのその他の機能を提供することは可能ですか?おそらく、独自のレポート送信者を実装する統合機能を使用していますか?あるいは、この時点で他のフラグメント/ダイアログ/アクティビティをもう表示することはできませんか? – Harry500