Android去除煩人的預設閃退Dialog_Android

來源:互聯網
上載者:User

安卓應用閃退後總會出現一個“抱歉,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要整合BaseActivity。

必要的善後工作
為了處理閃退,提升使用者體驗,有必要做一些善後工作,主要有幾條羅列如下:

異常上報
可以採用郵件或者通過伺服器介面上傳的方式。兩者各有優缺點,郵件方式開發簡單,但需要使用者額外操作,使用者體驗較差。如果用上傳伺服器方式,因為在UnCaughtExceptionHandler中不能開啟一個新的線程,所以只能同步請求,在網路情況不好的時候花費時間會較長而阻塞運行。也可能因為網路原因而上報失敗。當然總體下來還是上傳伺服器好一點。具體實現留給讀者。

記錄日誌
將閃退資訊儲存到檔案系統中。不能存到SharedPreferences中,因為開啟SP需要使用一個新的線程(Android內部實現),而這在UnCaughtExceptionHandler中,這是不被允許的。

閃退三次清除資料
很多時候是由於後台返回資料錯誤導致的閃退。如果這些資料被緩衝下來,那麼使用者即使再次開啟還是會發生閃退,這時候就只能通過重裝或者清除資料的方式才能解決閃退問題,使用者體驗十分不好。所以在多次閃退後自動清除快取資料十分必要。具體實現可以參考我的另一篇部落格Android實現多次閃退清除資料。不過該部落格中使用的是ACRA,一個對UnCaughtExceptionHandler再次封裝的開源項目,讀者可以將ACRA替換為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中新開一個線程,會拋出異常。

以上就是本文的全部內容,希望對大家的學習有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.