Android中实现用户无感知处理后台崩溃
2023-03-31 11:04:08 时间
正所谓,要想没有bug,就一行代码也不写。App到了用户的手里,肯定是崩溃越少越好。Android中的崩溃处理和iOS不太一样,iOS崩溃通常是闪退,而安卓会出现如下的蹩脚的对话框。
当你的用户看到类似这样的崩溃对话框时,心中得到“这届程序员不行啊”的感慨也不足为奇。
在安卓中,我们应用会有所谓的前台和后台的概念,在本文这里这样定义,当前应用有Activity展示(即用户明显感知在当前应用),约定为前台,否则为后台。
如果在前台时,发生崩溃用户是明显能感知的,但倘若发生在后台,我们可以做一些简单的小操作,让用户感知不到崩溃的发生(即不弹出崩溃的对话框)。
原理其实蛮简单的。
- 检测是否为后台
- 如果是后台则杀掉该进程,否则执行默认的崩溃处理
检测是否为后台,这里我们以进程中Activity的数量作为判断标准
- 当activity onStart时activityCount自增
- 当Activity onStop时activityCount自减
- 当activityCount为0,我们则认为应用处于后台状态
具体实现如下:
- object ActivityLifecycleCallbackImp: Application.ActivityLifecycleCallbacks {
- var activityCount: Int = 0
- override fun onActivityPaused(activity: Activity?) {
- }
- override fun onActivityResumed(activity: Activity?) {
- }
- override fun onActivityStarted(activity: Activity?) {
- activityCount ++
- }
- override fun onActivityDestroyed(activity: Activity?) {
- }
- override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
- }
- override fun onActivityStopped(activity: Activity?) {
- activityCount--
- }
- override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
- }
- }
在Application中进行注册:
- class MyApplication : Application() {
- override fun onCreate() {
- super.onCreate()
- registerActivityLifecycleCallbacks(ActivityLifecycleCallbackImp)
- }
- }
剩下的就是设置一个自定义的未捕获异常处理处理器:
- val defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
- Thread.setDefaultUncaughtExceptionHandler { thread, exception ->
- exception.printStackTrace()
- val isBackground = ActivityLifecycleCallbackImp.activityCount == 0
- if (isBackground) {
- Log.d("MyApplication", "isBackground just kill the process without annoying users")
- android.os.Process.killProcess(android.os.Process.myPid())
- } else {
- defaultHandler.uncaughtException(thread, exception)
- }
- }
至此功能就基本实现了,相对之前硬邦邦的对话框,后台无干扰用户的默默杀掉进程要友好很多了。
相关文章
- Cocos Creator 打包原生 Android 包该如何选择 NDK 版本?
- 企业应用架构研究系列十三:整合EFCore&Dapper 通用ORM框架EFDapper
- 使用小黄鸟(HttpCanary)+模拟器(VMOS Pro)对手机APP进行抓包(附带软件)
- 【Dubbo3终极特性】「云原生三中心架构」带你探索Dubbo3体系下的配置中心和元数据中心、注册中心的原理及开发实战(上)
- Angularjs——初识AngularJS
- 企业应用架构研究系列二十五:IdentityServer4 认证服务搭建
- 一文了解 Dubbo 3 配置工作原理
- 【Android 】使用MediaPlayer播放音频以及AudioManager简介
- 【架构设计】如何让你的应用做到高内聚、低耦合?
- 【架构设计】你的应用该如何分层呢?
- netcore下RabbitMQ队列、死信队列、延时队列及小应用
- 从微信读书聊起2023
- Redis set数据类型命令使用及应用场景使用总结
- 痞子衡嵌入式:Farewell, 我的写博故事2022
- IdentityServer4 - v4.x .Net中的实践应用
- 上周热点回顾(12.19-12.25)
- 学习.NET MAUI Blazor(二)、MAUI是个啥
- PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台
- PowerDotNet平台化软件架构设计与实现系列(14):平台建设指南
- PowerDotNet平台化软件架构设计与实现系列(13):应用监控平台