Implementing user-unaware background crash handling in Android

Implementing user-unaware background crash handling in Android

As the saying goes, if you want to have no bugs, don't write a single line of code. When an app reaches the hands of users, the fewer crashes the better. Crash handling in Android is different from that in iOS. iOS crashes usually result in a flash back, while Android will display a clumsy dialog box as shown below.

It’s not surprising that when your users see a crash dialog like this, they think “this class of programmers is terrible”.

In Android, our applications have the concept of foreground and background. In this article, it is defined as follows: the current application has an Activity displayed (that is, the user clearly perceives that they are in the current application), which is agreed to be the foreground, otherwise it is the background.

If a crash occurs in the foreground, the user will be able to clearly perceive it, but if it happens in the background, we can do some simple operations to prevent the user from noticing the crash (i.e., no crash dialog box will pop up).

The principle is actually quite simple.

  • Check whether it is background
  • If it is a background process, kill the process, otherwise execute the default crash handling

Check whether it is background. Here we use the number of Activities in the process as the judgment standard

  • When activity onStart, activityCount increases automatically
  • When Activity onStop, activityCount is decremented
  • When activityCount is 0, we consider the application to be in the background state

The specific implementation is as follows:

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

Register in Application:

  1. class MyApplication : Application() {
  2. override fun onCreate() {
  3. super.onCreate()
  4. registerActivityLifecycleCallbacks(ActivityLifecycleCallbackImp)
  5. }
  6. }

All that's left is to set up a custom uncaught exception handler:

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

This function has been basically realized. Compared with the previous rigid dialog box, it is much more friendly to kill the process silently in the background without interfering with the user.

<<:  Big data "killing familiarity" new gameplay or Apple's deep routine

>>:  iOS+PWA is here, are you here?

Recommend

Small but different Xiaomi 40-inch TV Xiaomi TV 2 first experience

At the beginning of this year, the appearance of ...

2020 New Advertising Law Banned Words Cases

Something happened not long ago that angered the ...

Why is the plan written so comprehensively but useless?

Understand the general product situation step by ...

VideoStudio 2020 video tutorials from beginner to advanced

Suitable for people: Beginners who want to system...

Can the 3-meter-long killer crab be eaten? Is it delicious?

recent Tadpole is getting ready because Crab seas...

Operational tips: In the early stage of promotion, should we use WeChat or App?

The author of this article is Qianniu Xujin, form...

25 great tips for intermediate Git users

I had been using Git for about 18 months and thou...

Shh! Here's a quick guide to surviving a drinking party

The wine table during the Chinese New Year can be...

Douyin Qianchuan push flow mechanism new rules and brand promotion

"In just a few seconds of video, everything ...

The "residents" of the rainforest are quietly changing

Produced by: Science Popularization China Author:...