2017-03-02 15 views
1

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); 
    } 
} 
+0

ACRAに接続するだけでよいでしょう。それ以外の場合は、ACRAの実装を見て、ACRAの実装方法を決定します。未処理の例外時にこのようなことをするのは、環境がかなり壊れている可能性があるため(たとえば、「OutOfMemoryError」がクラッシュを引き起こしたものなど)、正しく処理するのは難しいです。 – CommonsWare

+0

ありがとうございます。私はACRAを見ていきます。それにもかかわらず、私は本当になぜそれがうまくいかないのか興味があります。しかし、私は自分自身でスローされた例外を使ってテストしました。最初はこのシナリオをテストするための単純な "空の" RuntimeExceptionです。 – Harry500

+0

ACRAでは、レポートデータを表示するためのダイアログとして表示されるカスタムダイアログ(Fregment)やアクティビティを表示したり、レポートを保存するなどのその他の機能を提供することは可能ですか?おそらく、独自のレポート送信者を実装する統合機能を使用していますか?あるいは、この時点で他のフラグメント/ダイアログ/アクティビティをもう表示することはできませんか? – Harry500

答えて

0

はフルを投稿しますメッセージ(コメントが短すぎます)、ここでフルクラスと設定:

ACRAと組み込みのダイアログ機能を使用しようとしましたが、動作させることができませんでした。しかし、 "トースト"を表示する組み込みのfuntionalityが動作します!ですから、問題がどこに表示されているのか自分に尋ねるのです。私は、次の初期化を使用して自分のアプリケーション・クラスの中

@ReportsCrashes(
    formUri = "http://yourserver.com/yourscript", 
    mode = ReportingInteractionMode.NOTIFICATION, 
    resDialogText = R.string.app_name, 
    resNotifTickerText = R.string.app_name, 
    resNotifTitle = R.string.app_name, 
    resNotifText = R.string.app_name 
) 

:私はテストのために、次の@ReportCrashedアノテーションを使用

public class ThisApplication extends Application { 
    @Override 
    protected void attachBaseContext(Context base) { 
     super.attachBaseContext(base); 

     final ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(this); 
     configurationBuilder.setBuildConfigClass(BuildConfig.class); 

     final ACRAConfiguration config; 
     try { 
      config = configurationBuilder.build(); 
      ACRA.init(this, config); 
     } catch (ACRAConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

私のアプリは、二つの異なるビルド味と2つのビルドタイプ「のデバッグを使用しています"と"リリース "。

未処理の例外をスローすると、アプリケーションが閉じられ、ダイアログがダイアログが表示されずにすべてのアプリケーションが閉じられる前に、非常に短い時間(0.5秒未満)しか表示されないことがあります。

任意のアイデア...

EDIT:?上記の注釈も動作しません通知、と試みました。通知はまた、非常に短い瞬間にのみ表示され、すぐに消えます。ダイアログ注釈は次のとおりです。

@ReportsCrashes(
    formUri = "http://yourserver.com/yourscript", 
    mode = ReportingInteractionMode.DIALOG, 
    resDialogText = R.string.app_name 
) 

これは上記の効果をもたらします。

0

問題は、少なくともACRA-Dialogの場合、アンドロイドスタジオの組み込み機能でデバッグされているため、問題はありませんでした。だからあなたはアンドロイドスタジオIDEのサポートなしで(デバッグデバイス上の)アンドロイドテストシステムでアプリを起動する必要があります。これを実行して例外がスローされると、ACRAダイアログが表示されます。

関連する問題