• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Android檢測程序崩潰框架CustomActivityOnCrash

    標簽: android  框架  指針  檢測程序崩潰  App崩潰檢測

    Android檢測程序崩潰框架CustomActivityOnCrash

    在Android程序中,程序有時會遇到各種之前沒有遇到的問題,這時如果能夠對程序進行額外判斷就好的,CustomActivityOnCrash框架就實現的這個功能。如果你的程序出現崩潰,它會檢測到(各種崩潰,比如空指針),會彈出一個頁面,提示你程序崩潰,你是否要關閉程序,還是重新啟動程序!
    效果:
    1
    錯誤報告,可以直接顯示在頁面上或吐司出來!
    崩潰后顯示的頁面既可以是框架默認的,也可以是自己定義的。

    原文章:https://github.com/Ereza/CustomActivityOnCrash
    文章全是英文,而且是在Studio中運行,我的運行環境是IDEA!不能依賴,只能把文件復制進來,其實文件不多,就幾個java文件!還有些資源文件!和一個jar包:support-annotations-26.0.0-alpha1.jar,框架中有一個注解類是V4包下沒有,只能用上面那個包!

    使用方法,我的和原作者的是一樣的,但是我的講解更詳細,而且是中文!

    步驟一

    導入框架類和jar包(IDEA不能依賴,使用可以直接把那些文件加入到你的src文件加下就可以)
    如圖所示:
    2
    可以看到這個框架總共就四個java文件!
    這個上面導入的jar包,可能會跟V4的沖突!在Studio中是完全沒有問題的!
    框架內也是有一個DefaultErrorActivity,要在AndroidManifest中注冊!

    步驟二

    在繼承Application的類中進行基本設置

    package com.lwz.oncrash;
    
    import android.app.Application;
    import android.util.Log;
    import cat.ereza.customactivityoncrash.CustomActivityOnCrash;
    import cat.ereza.customactivityoncrash.activity.DefaultErrorActivity;
    import cat.ereza.customactivityoncrash.config.CaocConfig;
    
    /**
     * Application 
     * 程序崩潰的基本設置,請看注解!
     */
    
    public class App extends Application {
        private static final String TAG = "TAG";
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            //整個配置屬性,可以設置一個或多個,也可以一個都不設置
            CaocConfig.Builder.create()
                    //程序在后臺時,發生崩潰的三種處理方式
                    //BackgroundMode.BACKGROUND_MODE_SHOW_CUSTOM: //當應用程序處于后臺時崩潰,也會啟動錯誤頁面,
                    //BackgroundMode.BACKGROUND_MODE_CRASH:      //當應用程序處于后臺崩潰時顯示默認系統錯誤(一個系統提示的錯誤對話框),
                    //BackgroundMode.BACKGROUND_MODE_SILENT:     //當應用程序處于后臺時崩潰,默默地關閉程序!這種模式我感覺最好
                    .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT)
                    .enabled(true)     //這阻止了對崩潰的攔截,false表示阻止。用它來禁用customactivityoncrash框架
                    .showErrorDetails(false) //這將隱藏錯誤活動中的“錯誤詳細信息”按鈕,從而隱藏堆棧跟蹤。
                    .showRestartButton(false)    //是否可以重啟頁面
                    .trackActivities(true)     //錯誤頁面中顯示錯誤詳細信息
                 .minTimeBetweenCrashesMs(2000)      //定義應用程序崩潰之間的最短時間,以確定我們不在崩潰循環中。比如:在規定的時間內再次崩潰,框架將不處理,讓系統處理!
                    .errorDrawable(R.drawable.ic_launcher)     //崩潰頁面顯示的圖標
                    .restartActivity(MainActivity.class)      //重新啟動后的頁面
                    .errorActivity(DefaultErrorActivity.class) //程序崩潰后顯示的頁面
                    .eventListener(new CustomEventListener())//設置監聽
                    .apply();
            //如果沒有任何配置,程序崩潰顯示的是默認的設置
            CustomActivityOnCrash.install(this);
    
        }
    
        /**
         * 監聽程序崩潰/重啟
         */
        private static class CustomEventListener implements CustomActivityOnCrash.EventListener {
            //程序崩潰回調
            @Override
            public void onLaunchErrorActivity() {
                Log.e(TAG, "onLaunchErrorActivity()");
            }
    
            //重啟程序時回調
            @Override
            public void onRestartAppFromErrorActivity() {
                Log.e(TAG, "onRestartAppFromErrorActivity()");
            }
    
            //在崩潰提示頁面關閉程序時回調
            @Override
            public void onCloseAppFromErrorActivity() {
                Log.e(TAG, "onCloseAppFromErrorActivity()");
            }
    
        }
    }
    

    上面很多語句都是可以不設置的,但是你至少要在onCreate中設置一句話:

     //如果沒有任何配置,程序崩潰顯示的是默認的設置
     CustomActivityOnCrash.install(this);
    

    最后記得在AndroidManifest中注冊下App!

    做完前面兩個,其實是已經可以實現程序崩潰后的簡單處理。
    但是框架崩潰頁面只能選擇關閉頁面或重啟程序的其中一種,并且要在config對象里面設置好。

     .showRestartButton(false)    //默認false,是否可以重啟頁面,

    如果設置true,默認的程序崩潰頁面只能選擇重啟程序,如果設置false,默認的程序崩潰頁面只能選擇關閉程序!

    步驟三

    如果你想自己設置,程序崩潰后顯示的頁面,也是可以的,并且可以同時顯示關閉程序和重新啟動程序
    下面就是自定義的程序崩潰后的Activity

    
    package com.lwz.oncrash;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import cat.ereza.customactivityoncrash.CustomActivityOnCrash;
    import cat.ereza.customactivityoncrash.config.CaocConfig;
    
    /**
     * 程序崩潰后顯示的崩潰頁面
     * 自定義的錯誤顯示頁面
     */
    public class CustomErrorActivity extends Activity implements View.OnClickListener {
    
        TextView errorDetailsText;//顯示崩潰提示的文本
        Button btn_restart;//關閉頁面的按鈕
        Button btn_close;//關閉頁面的按鈕
        CaocConfig config;//配置對象
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_custom_error);
            initView();
            initData();
            initEvent();
    
        }
    
        private void initView() {
            errorDetailsText = (TextView) findViewById(R.id.error_details);
            btn_restart = (Button) findViewById(R.id.btn_restart);
            btn_close = (Button) findViewById(R.id.btn_close);
        }
    
        private void initData() {
            //可以獲取到的四個信息:
            String stackString = CustomActivityOnCrash.getStackTraceFromIntent(getIntent());//將堆棧跟蹤作為字符串獲取。
            String logString = CustomActivityOnCrash.getActivityLogFromIntent(getIntent()); //獲取錯誤報告的Log信息
            String allString = CustomActivityOnCrash.getAllErrorDetailsFromIntent(this, getIntent());// 獲取所有的信息
            config = CustomActivityOnCrash.getConfigFromIntent(getIntent());//獲得配置信息,比如設置的程序崩潰顯示的頁面和重新啟動顯示的頁面等等信息
    
            errorDetailsText.setText("程序崩潰了!");
    
            //吐司
            Toast.makeText(this, stackString, Toast.LENGTH_SHORT).show();
        }
    
        private void initEvent() {
            btn_restart.setOnClickListener(this);
            btn_close.setOnClickListener(this);
    
        }
    
        public void onClick(View v) {
            if (config != null && config.getRestartActivityClass() != null) {
                //重啟程序
                if (v.getId() == R.id.btn_restart) {
                    CustomActivityOnCrash.restartApplication(CustomErrorActivity.this, config);
                }
    
            }
            if (config != null) {
                //關閉頁面
                if (v.getId() == R.id.btn_close) {
                    CustomActivityOnCrash.closeApplication(CustomErrorActivity.this, config);
                }
            }
        }
    }
    
    

    上面可以看到無論是程序關閉還是重啟都是使用了CustomActivityOnCrash的靜態方法,但是重啟要判斷是否設置了重新啟動后顯示的頁面!

      .restartActivity(MainActivity.class)      //設置重新啟動后的頁面
      .errorActivity(DefaultErrorActivity.class) //設置程序崩潰后顯示的頁面
    
    

    這里重啟不一定要顯示到程序的主界面,可以是程序的任意Activity!只是看你在config中是怎么設置的,
    但是要注意,如果那個非主界面頁面是從其他頁面跳轉過去的,并且還攜帶了不少數據,重啟后頁面是無法獲取到數據的。

    設置程序在后臺崩潰后的處理情況

    在上面演示動畫中可以看到有一個5秒后程序崩潰的情況,就是為了測試,后臺崩潰的處理情況

                     //程序在后臺時,發生崩潰的三種處理方式
                    //BackgroundMode.BACKGROUND_MODE_SHOW_CUSTOM: //當應用程序處于后臺時崩潰,也會啟動錯誤頁面,
                    //BackgroundMode.BACKGROUND_MODE_CRASH:      //當應用程序處于后臺崩潰時顯示默認系統錯誤(一個系統提示的錯誤對話框),
                    //BackgroundMode.BACKGROUND_MODE_SILENT:     //當應用程序處于后臺時崩潰,默默地關閉程序!這種模式我感覺最好
                    .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT)
    

    看上面解釋應該是很清楚了吧!

    1.依然顯示崩潰頁面:

    
    .backgroundMode(CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM)//即使退到后臺,崩潰頁面依然顯示
    

    效果:
    4

    2.顯示的是系統的崩潰頁面:

    
    .backgroundMode(CaocConfig.BACKGROUND_MODE_CRASH)//即使退到后臺,崩潰頁面依然顯示
    

    效果:
    5

    3.不顯示崩潰頁面:

    個人感覺這個設置比較好,程序蹦就蹦了,下次打開,就重新打開程序就好了!

    .backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT)//即使退到后臺,崩潰頁面依然顯示
    

    效果:
    6

    我的項目源碼:https://github.com/liwenzhi/CustomActivityOnCrashDemo_Eclipse

    共勉:生,活!

    版權聲明:本文為wenzhi20102321原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/wenzhi20102321/article/details/75578075

    智能推薦

    Android TimeoutException崩潰學習筆記

    文章目錄 主要引發原因 復現 解決方法 主要引發原因 Java對象的finalize()方法處理超時。 Java的Object對象中,有一個finalize()方法,默認實現為空。 finalize()的官方Doc(android-28)如下: Called by the garbage collector on an object when garbage collection determin...

    Qt 之 程序崩潰分析

    前言 所謂程序界的三大問題:崩潰,死鎖,內存泄漏,要是解決的好就好,解決的不好就有可能面臨走人的窘境,本篇來聊一下Qt下崩潰的解決思路。 開始 Win下定位崩潰無非就是那么兩個文件,一個是dump文件(linux下就是core文件),另一個就是pdb文件(linux下就是elf信息)。 首先是要準備好程序的pdb文件,記住,pdb必須和exe程序匹配,也就是說,你當前的exe程序只能使用你當前的p...

    Android學習筆記 ----啟動 Theme.Dialog 主題的Activity時程序崩潰的解決辦法

    新建了一個Android Studio工程,在MainActivity的主界面中添加了兩個按鈕,點擊其中一個按鈕用來啟動 NormalActivity,點擊另一按鈕用來啟動DialogActivity. 其中,NormalActivity和DialogActivity都是很簡單的界面,只是在AndroidManifest.xml中,對DialogActivity添加主題 android:theme...

    Android平臺異常崩潰捕捉處理

    原文:https://blog.csdn.net/leeo1010/article/details/50522892 在我們Android開發的過程中,經常碰到app崩潰的狀況。目前市面上各種各樣的手機,可能不會每個都能兼容,在開發的時候可能不會出現這種狀況,但是上線之后,可能會出現個別機型crash的情況。同時開發時由于各種疏忽也會造成有些bug漏洞。在這些情況下,我們就要實時的手機這個報錯日志...

    android 調試崩潰Unable to instantiate application ***

    更新后Android 調試app崩潰!Unable to instantiate application *** 問題原因:耗盡元氣最后得出:不詳,可能由于機型原因,模擬器沒有問題,可能由于AS版本問題,筆者AS3.0。 改為低版本的gradle并不推薦: 解決方法: 打開設置:file->settings,搜索Instant Run,取消勾選Enable Instant Run ...

    猜你喜歡

    鷹眼Android平臺崩潰監控實踐

    在移動應用開發及應用發布階段經常碰到應用崩潰的情況。對于開發階段出現的崩潰,開發者可以從后臺日志中獲取崩潰堆棧進行分析;而線上出現的崩潰,開發者看不到后臺日志,難以獲取崩潰堆棧。這就需要一款可以監控線上應用崩潰情況的工具,當應用出現崩潰時及時收集堆棧信息進行分析,然后上報給服務端,開發者就可以在控制臺實時了解應用的崩潰情況。為了滿足監控移動端線上崩潰的需求,我們打造了鷹眼監控系統。鷹眼支持iOS、...

    Leecode-面試題64-求1+2+...+n

    這道題整有點蒙...

    序列求和 c++

    /******** 問題描述 求1+2+3+…+n的值。 輸入格式 輸入包括一個整數n。 輸出格式 輸出一行,包括一個整數,表示1+2+3+…+n的值。 樣例輸入 4 樣例輸出 10 樣例輸入 100 說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的做題。 一般在提交之前所有這些樣例都需要測試通過才行,但這不代表這幾組樣例數據都正確了你的程序就是完全正確的,潛在的錯...

    8086匯編語言:BIOS中斷調用在屏幕上輸出圖案

    一、題目說明: ——在屏幕的第2行、第3列處顯示四個紅色的‘ * ’ ——在屏幕上輸出一個圖案,圖案內容自行設計   二、實驗原理: 用戶在匯編語言程序中可使用軟中斷指令——INT n;調用BIOS程序,其中 n 是中斷類型碼。 常用的BIOS程序的功能與其中斷類型碼對應關系如下表: BIOS...

    python3 動態創建類對象并調用函數

    1. 首先import相關模塊`import importlib` 2. 加載你想要加載的模塊`model = importlib.import_module(模塊名稱)` 3. 獲取類對象`api_class = getattr(model, 類名)` 4. 創建類對象的實例`api_instance = api_class()` 5. 調用類對象的函數`api_instance.get_res...

    精品国产乱码久久久久久蜜桃不卡