利用多进程应对集成第三方模块时App的闪退

前言

现在的App已经越来越庞大了,有时我们开发的App只能算是一个平台,我们的功能只是提供一些基础性的功能和第三方模块集成的能力,然后利用模块化或插件化技术将其它的功能模块集成进来,但这时我们会遇到一个问题-我们并不能保证这些第三方的功能的稳定性,第三方的功能模块因为测试不够还是别的各种原因出现异常闪退了,导致我们自己的App闪退了,这时后台Bug收集系统的Bug短信立刻就发到手机上面来了,甚至领导第一时间也过来问候你的工作情况了。我们表示很无奈,一看异常日志,并不是我们自己app的问题啊。

解决方案

这时我们就可以利用多进程的方式来解决这个问题,我们自己的主体使用一个进程来运行,其它的模块利用一个新的进程来执行,这时即使第三方功能模块的进程崩溃了,我们自己的进程却还是存在的,App本体并没有闪退,给人的感觉只是某个界面闪退了,然后回到了主界面,这时我们还可以给用户一些提示告诉他这个模块功能有点问题,这样用户体验就好很多了,只是让用户觉得App的某个功能模块不是太好还不完善,我们自己也不用被领导问候,这时要么停用这个有问题的模块,要么派人去联系这个有问题的开发公司就行了,我们喝喝茶就行了…

实现方式

Android中开启一个新的进程还是很方便的,只需要在Manifast文件中设置一下就行了。
这里写图片描述
不过我们还需要设置一下UnCatchExceptionHandler,因为新的进程死掉了,虽然我们的主进程不会挂掉,但是会默认弹出来一个系统的弹框,点击之后会自动Android的Launch界面,给人的感觉还是崩了,因此我们需要自己处理未捕获的异常,让系统默认的弹窗不弹出来,直接杀死挂掉的进程。然后回到主进程界面。

进程挂掉自动重启打开Activity的问题

这里我们可能会遇到一个坑,就是进程死掉了之后会自动重新创建一个进程,并且把栈顶的Activity给重新创建,所以看起来又重新打开了。
所以我们需要把全部的Activity管理起来,进程死掉了之后就把全部的Activity栈给清空,这样Android系统就不会重新打开界面了。

registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityPaused(activity: Activity?) {
            }

            override fun onActivityResumed(activity: Activity?) {
            }

            override fun onActivityStarted(activity: Activity?) {
            }

            override fun onActivityDestroyed(activity: Activity?) {
                activities.remove(activity!!)
            }

            override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
            }

            override fun onActivityStopped(activity: Activity?) {
            }

            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                activities.add(activity!!)
            }

        })

然后我们在发生异常后将所有管理的Activity栈全部都移除掉,最后我们再kill掉这个挂掉的进程,这样即使出现异常主程序也不会挂掉,用户体验有了大幅提高。

 Thread.setDefaultUncaughtExceptionHandler { t, e ->

            Thread({
                Looper.prepare()
                Toast.makeText(instance, e.message + "  某些功能可能无法正常使用!", Toast.LENGTH_LONG).show();
                Looper.loop()
            }).start()

            Thread(Runnable {

                Thread.sleep(2000)
                for (activity in activities) {
                    activity.finish()
                }

                Process.killProcess(Process.myPid())
                System.exit(10)
            }).start()
        }

参考内容:
如何优雅的退出应用和处理崩溃异常自动重启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值