0

私はアンドロイドアプリケーション(ラッパー)のapplication.onCreate()で初期化されたライブラリモジュール "A"を持っています。モジュール "A"にキャッチされていない例外がある場合、それはモジュール "B"内の受信機によって受信されるべき放送を送信し、モジュールはその情報をサーバに送信する。1つのライブラリモジュールでキャッチされていない例外をキャッチし、別のライブラリモジュールで受信する必要があるブロードキャストを送信する方法

ここで問題は、モジュール "B"で例外がキャッチされたときにブロードキャストを送信するが、受信されずにアプリケーションがハングするということです。

モジュールAの唯一の活動のonCreate()のマイコードです。 LocalBroadcastManagerを使用してブロードキャストを送信しています。あなたは、複数の活動は、あなたが、ログを扱う現在のアプリケーションを終了し、バグレポートを送信するために、新たなアプリ/活動を開始することができますハンドラ内で、アプリケーションのクラスでキャッチされないハンドラを設定している場合

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
      @Override 
      public void uncaughtException(Thread thread, Throwable ex) { 
       trackCardInfoSessionEnd(CardInfoAnalyticsConstants.CARD_INFO_BROADCAST_SESSION_END, "failed"); 
       finish(); 
      } 
     }); 

答えて

0

public class MyApp extends Application { 

@Override 
public void onCreate() { 
    super.onCreate(); 

    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread thread, Throwable ex) { 
      trackCardInfoSessionEnd(CardInfoAnalyticsConstants.CARD_INFO_BROADCAST_SESSION_END, "failed"); 
      android.os.Process.killProcess(android.os.Process.myPid()); 
      System.exit(10); 
     } 
    }); 
} 

}

thisのリンクをご確認ください。

+0

私がお探しの答えはありません。 android.os.Process.killProcess(android.os.Process.myPid());または System.exit(10);ブロードキャストレシーバがインテントを受信して​​処理を行うことができないようにアプリを殺すだけです。私は、アプリケーションを殺していないが、単にアクティビティを終了している間に処理を行う必要があります。 – Rahul

+0

1.すべてのアンドロイドコンポーネントはメインスレッド上で動作します。 – Praveen

+1

1.すべてのアンドロイドコンポーネント(アクティビティ、サービス、ブロードキャストレシーバ)はメインスレッド上で動作します。 2.キャッチされない例外は、発生したスレッドに基づいて処理されます。 3.例外がスレッドで発生した場合、そのスレッドのdispatchUncaughtExceptionハンドラが呼び出され、スレッドが終了します。 http://www.javamex.com/tutorials/exceptions/exceptions_uncaught_handler.shtml 4.メインスレッドで例外が発生すると、メインスレッドは終了され、アプリの他のコンポーネントが終了します。ただし、保留中のインテントとアラームマネージャを使用してコンポーネントを再起動することはできますが、それは正しいユースケースではありません。 – Praveen

関連する問題