自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android中實現(xiàn)用戶無感知處理后臺崩潰

移動開發(fā) Android
正所謂,要想沒有bug,就一行代碼也不寫。App到了用戶的手里,肯定是崩潰越少越好。Android中的崩潰處理和iOS不太一樣,iOS崩潰通常是閃退,而安卓會出現(xiàn)如下的蹩腳的對話框。

正所謂,要想沒有bug,就一行代碼也不寫。App到了用戶的手里,肯定是崩潰越少越好。Android中的崩潰處理和iOS不太一樣,iOS崩潰通常是閃退,而安卓會出現(xiàn)如下的蹩腳的對話框。 

Android中實現(xiàn)用戶無感知處理后臺崩潰

當你的用戶看到類似這樣的崩潰對話框時,心中得到“這屆程序員不行啊”的感慨也不足為奇。

在安卓中,我們應用會有所謂的前臺和后臺的概念,在本文這里這樣定義,當前應用有Activity展示(即用戶明顯感知在當前應用),約定為前臺,否則為后臺。

如果在前臺時,發(fā)生崩潰用戶是明顯能感知的,但倘若發(fā)生在后臺,我們可以做一些簡單的小操作,讓用戶感知不到崩潰的發(fā)生(即不彈出崩潰的對話框)。

原理其實蠻簡單的。

  • 檢測是否為后臺
  • 如果是后臺則殺掉該進程,否則執(zhí)行默認的崩潰處理

檢測是否為后臺,這里我們以進程中Activity的數(shù)量作為判斷標準

  • 當activity onStart時activityCount自增
  • 當Activity onStop時activityCount自減
  • 當activityCount為0,我們則認為應用處于后臺狀態(tài)

具體實現(xiàn)如下: 

  1. object ActivityLifecycleCallbackImp: Application.ActivityLifecycleCallbacks { 
  2.    var activityCount: Int = 0 
  3.    override fun onActivityPaused(activity: Activity?) { 
  4.    } 
  5.  
  6.    override fun onActivityResumed(activity: Activity?) { 
  7.    } 
  8.  
  9.    override fun onActivityStarted(activity: Activity?) { 
  10.        activityCount ++ 
  11.    } 
  12.  
  13.    override fun onActivityDestroyed(activity: Activity?) { 
  14.    } 
  15.  
  16.    override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) { 
  17.    } 
  18.  
  19.    override fun onActivityStopped(activity: Activity?) { 
  20.        activityCount-- 
  21.    } 
  22.  
  23.    override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) { 
  24.    } 

在Application中進行注冊: 

  1. class MyApplication : Application() { 
  2.    override fun onCreate() { 
  3.        super.onCreate() 
  4.        registerActivityLifecycleCallbacks(ActivityLifecycleCallbackImp) 
  5.    } 

剩下的就是設置一個自定義的未捕獲異常處理處理器: 

  1. val defaultHandler = Thread.getDefaultUncaughtExceptionHandler() 
  2. Thread.setDefaultUncaughtExceptionHandler { thread, exception -> 
  3.    exception.printStackTrace() 
  4.    val isBackground = ActivityLifecycleCallbackImp.activityCount == 0 
  5.    if (isBackground) { 
  6.        Log.d("MyApplication""isBackground just kill the process without annoying users"
  7.        android.os.Process.killProcess(android.os.Process.myPid()) 
  8.    } else { 
  9.        defaultHandler.uncaughtException(thread, exception) 
  10.    } 

至此功能就基本實現(xiàn)了,相對之前硬邦邦的對話框,后臺無干擾用戶的默默殺掉進程要友好很多了。

責任編輯:未麗燕 來源: 技術小黑屋
相關推薦

2022-09-28 12:39:46

axios攔截器

2009-12-30 09:45:52

Silverlight

2009-12-23 10:46:38

WPF實現(xiàn)用戶界面

2025-03-05 07:58:30

2012-05-04 09:28:49

Linux

2010-01-28 10:00:54

linux用戶注銷logout

2010-08-04 10:48:17

路由器

2024-07-11 10:38:02

2012-10-25 11:27:40

BYOD無感知認證Portal認證

2016-10-24 23:18:55

數(shù)據(jù)分析漏斗留存率

2015-05-28 18:52:32

斷網(wǎng)支付寶

2015-05-28 14:44:00

支付寶光纖被挖斷

2016-05-17 10:03:39

用戶體驗運維可度量

2018-05-30 10:22:47

電商平臺

2019-08-22 15:42:03

2025-03-28 04:10:00

2014-07-22 14:48:05

2024-09-22 10:46:33

數(shù)據(jù)飛輪算法

2021-09-17 09:00:00

安全身份認證OAuth 2.0

2020-12-22 15:39:38

AI
點贊
收藏

51CTO技術棧公眾號