俗话说,要想没有bug,一行代码都不用写。当应用程序在用户手中时,崩溃越少越好。Android中的崩溃处理与iOS中的不同。iOS崩溃一般是闪退,而Android会出现如下蹩脚的对话框。当你的用户看到这样的崩溃对话框时,他们心中产生“这类程序员做不到”的感觉也就不足为奇了。在Android中,我们的应用程序有所谓的前台和后台的概念,本文对此进行了定义。当前应用有一个Activity显示(即用户清楚地感知到它在当前应用中),约定为前台,否则为后台。如果是在前台,用户可以明显感知到崩溃,但是如果是发生在后台,我们可以做一些简单的操作,让用户感知不到崩溃(即不弹出崩溃对话框)).原理其实很简单。检测是否在后台。如果它在后台,则终止该进程。否则,执行默认的crash处理,检测是否在后台。这里我们以流程中的活动数为标准。当活动onStart时,activityCount自动增加。当activityonStop时,activityCount自动减少。如果activityCount为0,我们认为应用程序处于后台状态。具体实现如下:objectActivityLifecycleCallbackImp:Application.ActivityLifecycleCallbacks{varactivityCount:Int=0overridefunonActivityPaused(activity:Activity?){}overridefunonActivityResumed(activity:Activity?){}overridefunonActivity:Start{activityCount++}overridefunonActivityDestroyed(activity:Activity?){}overridefunonActivitySaveInstanceState(activity:Activity?,outState:Bundle?){}overridefunonActivityStopped(activity:Activity?){activityCount--}overridefunonActivityBundleCreated(activity:Insavedactivity?savedst?){}}在应用程序中注册:classMyApplication:Application(){overridefunonCreate(){super.onCreate()registerActivityLifecycleCallbacks(ActivityLifecycleCallbackImp)}}剩下的就是设置一个自定义的未捕获异常处理器:valdefaultHandler=Thread。getDefaultUncaughtExceptionHandler()Thread.setDefaultUncaughtExceptionHandler{thread,exception->exception.printStackTrace()valisBackground=ActivityLifecycleCallbackImp.activityCount==0if(isBackground){Log.d("MyApplication","isBackground只是杀死进程而不烦人的用户")android.os.Process.killProcess(Process.myPid())}else{defaultHandler.uncaughtException(thread,exception)}}至此,功能基本实现。相比之前死板的对话框,在后台不干扰用户的情况下默默杀掉进程要友好很多
