首页 > 其他分享 >Android中实现用户无感知处理后台崩溃

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

时间:2022-11-10 20:33:28浏览次数:70  
标签:fun 崩溃 activityCount Activity override activity 后台 Android 感知


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

Android中实现用户无感知处理后台崩溃_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)
}
}

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

关于崩溃的文章,我还有一篇相关的,请移步这里​​Android处理崩溃的一些实践​​查看。

标签:fun,崩溃,activityCount,Activity,override,activity,后台,Android,感知
From: https://blog.51cto.com/u_3987305/5842017

相关文章

  • Android开发实用工具类之Log类
    哈喽,大家好!LZ是一名Android开发小鼠,个人开发过程中,不可避免的会遇到打Log查看日志的情况,大大滴方便省事,在此共享一个Log工具类,方便你我他~首先还是说一下为什么要使用Log......
  • Android开发实用工具类之数据校验类
    啦啦啦,今天为大家带来开发中会遇到的相关数据校验类,方便你我他~欢迎大家提供更好更棒的方式~代码一波来袭~packagecom.heliquan.test.util;importjava.text.SimpleDateFor......
  • Android Study之图解配置adb
    LZ-Says:话说中午看到苹果将要发布所谓的中国红,,,心里顿时有些小恶心,,,丫的,,,期待好久,,,就是这个结果,,,还是怀念乔帮主的时代啊~身为一名Android开发,ADB这个东西不可避免都会用到,当你如......
  • 说说关于Android使用Gson解析Json所需实体类的那些事~
    LZ-Says:技术,真的是日积月累,厚积薄发~前言目前解析json的方法有很多种,LZ个人认为使用Gson还是一种很不错的选择,因为使用Gson时,我们只需要考虑将json中参数和实体类属性一一对......
  • 涨姿势 之 Android Studio 3.5 设置类模版
    L-J_Q:遇到小赖皮怎么破?前言最近更新完AndroidStudio3.5后,突然发现之前设置的一些东西通通消失了,记得是覆盖呀。最无奈的一点就是每次新建类,都需要手动添加类注释,今天......
  • 涨姿势 之 Android Studio 解决 no module
    LZ-Says:总有一份关心,深入内心。前言终于多少明白鸡大说的沉浸,沉淀了。还好,最近的日子,充实,开森,爽~Today,不忍我的MBP桌面吃灰且也不想天天背着电脑挤地铁,最关键的还是我想......
  • Android Study 将DB打包APK
    LZ-Say:最近天有点凉了,小风嗖嗖的~各位注意身体~还记得项目中有相关城市以及区县联动显示,之前老版本是将这些内容保存文本,之后读取,转化,显示。挺麻烦的,所以打算直接弄成数据库......
  • Android Study 之学(kao)习(bei)官方关于64k异常处理 ^_^
    LZ-Says:在外面呆了一年又一年,似乎都快忘记当初出来的目的,不过,幸好,不忘初心~给家里买点东西,家里开心,我也开心~这就够了。前言随着APP的一次又一次迭代,APP的体积也越来越大,这......
  • Android Studio 2.3.1 变更SVN项目地址
    LZ-Says:技术前行道路上,真是挖坑不断,踩坑不止,填坑没完。。。前段时间访问SVN,结果看到上面乱糟糟的,这个给我愁的啊,直接归档整理了下。整理之后,之前项目SVN地址也没替换,今天更......
  • 解决Android Studio控制台中文乱码(方框)问题
    LZ-Say:坚持自己的,一步一个脚印努力走下去,加油!最近遇到个恶心的事儿,就使用死丢丢的时候,发现怎么我的控制台输出中文都显示方框???别人都没事,恶心坏我了。经过各种百度,终于找到解......