Android中实现用户无感知处理后台崩溃

移动开发 Android
正所谓,要想没有bug,就一行代码也不写。App到了用户的手里,肯定是崩溃越少越好。Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出现如下的蹩脚的对话框。

正所谓,要想没有bug,就一行代码也不写。App到了用户的手里,肯定是崩溃越少越好。Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出现如下的蹩脚的对话框。 

Android中实现用户无感知处理后台崩溃

当你的用户看到类似这样的崩溃对话框时,心中得到“这届程序员不行啊”的感慨也不足为奇。

在安卓中,我们应用会有所谓的前台和后台的概念,在本文这里这样定义,当前应用有Activity展示(即用户明显感知在当前应用),约定为前台,否则为后台。

如果在前台时,发生崩溃用户是明显能感知的,但倘若发生在后台,我们可以做一些简单的小操作,让用户感知不到崩溃的发生(即不弹出崩溃的对话框)。

原理其实蛮简单的。

  • 检测是否为后台
  • 如果是后台则杀掉该进程,否则执行默认的崩溃处理

检测是否为后台,这里我们以进程中Activity的数量作为判断标准

  • 当activity onStart时activityCount自增
  • 当Activity onStop时activityCount自减
  • 当activityCount为0,我们则认为应用处于后台状态

具体实现如下: 

  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.    } 

至此功能就基本实现了,相对之前硬邦邦的对话框,后台无干扰用户的默默杀掉进程要友好很多了。

责任编辑:未丽燕 来源: 技术小黑屋
相关推荐

2022-09-28 12:39:46

axios拦截器

2009-12-30 09:45:52

Silverlight

2009-12-23 10:46:38

WPF实现用户界面

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

数据分析漏斗留存率

2015-05-28 14:44:00

支付宝光纤被挖断

2015-05-28 18:52:32

断网支付宝

2016-05-17 10:03:39

用户体验运维可度量

2018-05-30 10:22:47

电商平台

2019-08-22 15:42:03

2024-09-22 10:46:33

数据飞轮算法

2014-07-22 14:48:05

2021-09-17 09:00:00

安全身份认证OAuth 2.0

2020-12-22 15:39:38

AI

2011-12-26 16:47:07

C#

2015-09-02 11:52:03

802.1xEAPPEAP
点赞
收藏

51CTO技术栈公众号