4

この回答に記載されているように、グローバル例外処理サービスをセットアップしようとしています。Thread.UncaughtExceptionHandlerアプリケーションが安定した状態にないか、OS によってプロセスが強制終了されるまでに十分な時間がない可能性があるため、クラッシュ後にカスタム コードが正常に実行されない可能性があるため、このアプローチは論理的に思えます。

残念ながら、このアプローチは機能しないようです。なぜなら、サービスは同じプロセスで起動されるため、サービスも強制終了されるからです。ハンドラーからサービスを開始するにはどうすればよいuncaughtException()ですか? 完全に別のプロセスでサービスを強制的に起動できますか?


カスタムのデフォルト (VM レベル) 例外ハンドラーを次のApplicationように設定しています。

public class MyApp extends Application {    
    @Override
    public void onCreate() {
        Thread.setDefaultUncaughtExceptionHandler(
            MyExceptionReporter.getInstance(this));
        ...

カスタム ハンドラーでは、次のようにサービスを起動しています。

final Intent i = new Intent(MyExceptionService.INTENT);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.putExtra(MyExceptionService.EXTRA_STACK_TRACE,
    Log.getStackTraceString(ex));
mContext.startService(i);

サービスはAndroidMaifest.xmlファイルで宣言されており、アプリケーションの他の場所から正常に起動します。

4

1 に答える 1

8

ああ、私はこれを理解しました。重要なのは、マニフェストに追加android:processすることでした。これにより、サービスが別のプロセスで強制的に起動されます。これにより、アプリケーションが強制終了されたときにサービスが強制終了されるのを防ぎます。

<service
    android:name="your.package.blah.blah.MyExceptionService"
    android:process=":exception" >
    <intent-filter>
        <action android:name="your.package.blah.blah.REPORT" />
    </intent-filter>
    </service>
于 2012-11-30T20:44:43.293 に答える