Androidは煩わしいフラッシュを除去Dialog


バックグラウンドのアンドロイドアプリが点滅すると、「申し訳ありませんが、Appは停止しています」というポップアップウィンドウが表示され、このようなユーザー体験はよくありません.多くの大手工場のAppはこの弾窓を除去しているので、デフォルトの閃退弾窓を除去する方法と、閃退時に必要な善後作業を紹介します.
いつものルールでは、番組が始まる前に、もう一度汽車に乗って、私が乗ったのは三人一列のもので、私の隣には中年のおじさんがいて、おじさんのそばにはきれいな女の子がいます.私は妹に声をかけたいと思って、おじさんに言いました.「おじさん、席を変えてもいいですか.私と彼女は友达です.」おじさんは私をちらっと見て、「私は彼のお父さんです」と淡々と言った.
UnCaughtExceptionHandler
UnCaughtExceptionHandlerは、Threadがcatchが住んでいないExceptionに遭遇して終了する前に後始末をすることができます.しかし、スレッドが停止するのを阻止することはできません.スレッドは最後に終了します.
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        System.exit(1);
    }
});

Dialog Androidシステムを削除すると、デフォルトではUnCaughtExceptionHandlerが設定されていますが、フラッシュバックウィンドウをポップアップする作業はこのhandlerで行われています.したがって、ポップアップウィンドウを除去するには、UnCaughtExceptionHandlerを実装し、システムのデフォルトを置き換えるだけでいいです.コードは次のとおりです.
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Thread.setDefaultUncaughtExceptionHandler(new MyUnCaughtExceptionHandler());
    }

    class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{

        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            ex.printStackTrace();
            // do some work here
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
        }
    }
}

以上、UnCaughtExceptionHandlerを置き換える作業はApplicationで統一されています.もちろん、Activityごとに行うこともできます.個々のActivityについては、Activityが多い場合はBaseActivityを実装し、BaseActivityに置き換え、他のActivityを統合する必要があります.
必要な後始末作業フラッシュバックを処理し、ユーザー体験を向上させるために、いくつかの後始末作業を行う必要があります.主にいくつかの羅列があります.
例外レポートは、メールまたはサーバインタフェースを介してアップロードできます.両者にはそれぞれメリットとデメリットがあり、メール方式の開発は簡単だが、ユーザーの追加操作が必要で、ユーザー体験が悪い.アップロードサーバ方式では、UnCaughtExceptionHandlerでは新しいスレッドを開くことができないため、リクエストを同期するしかなく、ネットワークの状況が悪いときに時間がかかり、実行をブロックします.ネットワーク上の理由でレポートに失敗することもあります.もちろん全体的にサーバーをアップロードしたほうがいいです.具体的な実現は読者に残す.
ログは、フラッシュバック情報をファイルシステムに格納します.SharedPreferencesには保存できません.SPを開くには新しいスレッド(Android内部実装)が必要ですが、これはUnCaughtExceptionHandlerでは許可されていません.
Appを再オープンすると、UnCaughtExceptionHandlerでAppを再オープンするか、カスタムポップアップウィンドウをポップアップできます.
class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        ex.printStackTrace();

        Intent intent = new Intent(App.this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        App.this.startActivity(intent);

        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(1);
    }
}

注意setFlagsこのステップは必須です.使用するContextはAppのContextなので、新しいタスクキューを開く必要があります.そうしないと、Activityを開くことはできません.Handlerを置き換えてActivityでやった場合、受け取ったContextがActivityのContextであれば、このステップは必要ありません.
注意事項の最も主要な注意点は私が前に言及したように、UnCaughtExceptionHandlerに新しいスレッドを開かないでください.異常を投げ出します.
正式なビジネスアプリはすべて専門のテストチームのテストを経て、よくcrashをしないと言っていますが、誰もバグがないことを保証することはできません.もしcrashが現れたら、この方法は多くのユーザーの体験を高めることができます.http://sixwolf.net/blog/2016/04/11/Android%E5%8E%BB%E9%99%A4%E7%83%A6%E4%BA%BA%E7%9A%84%E9%97%AA%E9%80%80%E5%BC%B9%E7%AA%97/
今期の番組はここまでで、皆さんの視聴に感謝します.