欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

提升应用崩溃时的用户体验——去掉烦人的“很抱歉”提示框

程序员文章站 2022-07-03 17:47:55
相信很多在用或者用过Android系统的的手机的朋友都有过这样的经历:自己玩着玩着某个程序,突然屏幕一黑,然后出现一个对话框,提示很抱歉,应用程序已经停止工作。这意味着程序已然崩溃了,用户唯一要做的就是接下来重新运行这个程序,或者去干些别的。我个人推测,前者占大多数。 当然,一些比较健壮的程序是一般 ......

相信很多在用或者用过android系统的的手机的朋友都有过这样的经历:自己玩着玩着某个程序,突然屏幕一黑,然后出现一个对话框,提示很抱歉,应用程序已经停止工作。这意味着程序已然崩溃了,用户唯一要做的就是接下来重新运行这个程序,或者去干些别的。我个人推测,前者占大多数。
当然,一些比较健壮的程序是一般不会出现这种情况的,但是,作为一名对用户负责的开发者,要时刻为用户着想,这就是我们今天要谈的话题——优化程序崩溃时的用户体验。
我们的目标是:程序发生了异常后,自定义异常处理流程,然后自动重新启动程序。
看上去貌似很复杂,其实很容易。核心在于对application这个单例的继承。
首先,在应用中写一个类,继承application,然后在androidmanifest.xml中注册,注册的代码可如下例:

<application
    android:name=".environment.baseapplication"
    android:enabled="true"
    android:icon="@drawable/icon64"
    android:label="@string/app_name"
    android:persistent="true" >
    ......
</application>

其中,我把继承了application的类是【包名】.environment.baseapplication。
大家可以根据自身的项目需要进行安排,不要忘了在这里注册就好。
之后就是对应用中未捕获的异常做处理了。
在baseapplication中,创建一个名为crashhandler的子类,该类实现uncaughtexceptionhandler接口,复写uncaughtexception方法。在该方法中,进行相应的崩溃处理。这里我们需要重启程序,因此,该子类可以写成如下代码段所示的内容:

// 异常处理
class crashhandler implements uncaughtexceptionhandler {

    @override
    public void uncaughtexception(thread thread, final throwable ex) {
        ex.printstacktrace();
        intent restartintent = new intent(baseapplication.this, splashscreen.class);
        restartintent.setflags(intent.flag_activity_new_task);
        startactivity(restartintent);
        android.os.process.killprocess(android.os.process.mypid());
    }
}

这里需要注意的是,intent对象的flag必须包含flag_activity_new_task。
最后,在复写的oncreate方法中,指定异常处理的方法:

thread.setdefaultuncaughtexceptionhandler(crashhandler);

其中,crashhandler为crashhandler的对象。
到此,我们的程序在发生崩溃的时候就不会出现“很抱歉。。。”的对话框了,取而代之的是自动重启。
当然,这只是一个治标不治本的方法,真正的解决之道依然要找到崩溃的位置,然后除掉这个bug。
最后,关于application,我这里就不多说了,如果诸位不是很了解的话,可以看下这位兄弟的文章,会大有启发: