Android開發之全域性異常捕獲完美閃退
阿新 • • 發佈:2019-01-30
一、Application的生命週期
在說如何完美退出APP之前,我們先來講講Application的生命週期.
1、onCreate,app啟動的主入口,程式啟動的時候呼叫
- @Override
- publicvoid onCreate() {
- super.onCreate();
- }
-
publicvoid onTerminate() {
- super.onTerminate();
- System.exit(0);
- }
3、onLowMemory()當後臺程式已經終止資源還匱乏的時候,會呼叫這個方法,一般的程式會在這裡釋放一些不必要的資源
- @Override
- publicvoid onLowMemory() {
- super.onLowMemory();
- }
4、onConfigurationChanged(Configuration newConfig),當配置改變時呼叫的方法
- @Override
-
public
- super.onConfigurationChanged(newConfig);
- }
二、全域性異常的捕獲及完美閃退出應用程式
直接上程式碼,程式碼大部分和網站別人的全域性異常捕獲一樣,但是,在初始化的時候,添加了application引數,在異常處理的方法也和別人的不一樣,詳細大家請仔細檢視註釋
- package com.batways.tnt.utils;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.io.Writer;
- import java.lang.Thread.UncaughtExceptionHandler;
- import java.lang.reflect.Field;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.Map;
- import com.batways.tnt.AppActivityManager;
- import com.batways.tnt.TntApplication;
- import com.batways.tnt.activity.MainActivity;
- import com.batways.tnt.activity.ProductActivity;
- import android.content.Context;
- import android.content.pm.PackageInfo;
- import android.content.pm.PackageManager;
- import android.content.pm.PackageManager.NameNotFoundException;
- import android.os.Build;
- import android.os.Environment;
- import android.util.Log;
- import android.widget.Toast;
- /**
- * @ClassName: CrashHandler
- * @author victor_freedom ([email protected])
- * @createddate 2014-12-25 下午11:41:12
- * @Description: UncaughtException處理類,當程式發生Uncaught異常的時候,有該類來接管程式,並記錄傳送錯誤報告.
- */
- publicclass CrashHandler implements UncaughtExceptionHandler {
- publicstaticfinal String TAG = "CrashHandler";
- // CrashHandler 例項
- privatestatic CrashHandler INSTANCE = new CrashHandler();
- // 程式的 Context 物件
- private Context mContext;
- <span> </span>// app物件
- private TntApplication app;
- // 系統預設的 UncaughtException 處理類
- private Thread.UncaughtExceptionHandler mDefaultHandler;
- // 用來儲存裝置資訊和異常資訊
- private Map<String, String> infos = new HashMap<String, String>();
- // 用於格式化日期,作為日誌檔名的一部分
- private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
- /** 保證只有一個 CrashHandler 例項 */
- private CrashHandler() {
- }
- /** 獲取 CrashHandler 例項 ,單例模式 */
- publicstatic CrashHandler getInstance() {
- return INSTANCE;
- }
- /**
- * @Title: init
- * @Description: 初始化
- * @param context
- * @param app
- * 傳入的app
- * @throws
- */
- publicvoid init(Context context, TntApplication app) {
- // 傳入app物件,為完美終止app
- this.app = app;
- mContext = context;
- // 獲取系統預設的 UncaughtException 處理器
- mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
- // 設定該 CrashHandler 為程式的預設處理器
- Thread.setDefaultUncaughtExceptionHandler(this);
- }
- /**
- * 當 UncaughtException 發生時會轉入該函式來處理
- */
- @Override
- publicvoid uncaughtException(Thread thread, Throwable ex) {
- if (!handleException(ex) && mDefaultHandler != null) {
- // 如果使用者沒有處理則讓系統預設的異常處理器來處理
- mDefaultHandler.uncaughtException(thread, ex);
- } else {
- // 釋放資源不能像常規的那樣在activity的onDestroy方法裡面執行,因為如果出現全域性異常捕獲,activity的關閉有時候是不會再走相關的生命週期函式的(onDesktroy,onStop,onPause等)。
- // 這裡是博主在退出app之前需要釋放掉的一些資源,通過之前講的AppActivityManager來拿到對應的例項activity釋放裡面的資源,然後呼叫AppExit退出應用程式
- ProductActivity activitys = (ProductActivity) AppActivityManager
- .getAppActivityManager().getActivity(ProductActivity.class);
- activitys.offline();
- MainActivity activity = (MainActivity) AppActivityManager
- .getAppActivityManager().getActivity(MainActivity.class);