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

相信很多在用或者用过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,我这里就不多说了,如果诸位不是很了解的话,可以看下这位兄弟的文章,会大有启发:

http://blog.csdn.net/pi9nc/article/details/11200969

原文地址:https://www.cnblogs.com/wenhanxiao/p/10331522.html

时间: 2024-10-10 21:53:28

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

提升业务价值 创见卓越用户体验 ——APM应用与整合分享

提升业务价值 创见卓越用户体验 --APM应用与整合分享 本文整理自GOPS2016全球运维大会 上海站 APM专场杭州数云运维总监罗兴峰的演讲. 我的分享和前面几位的出发点不太一样,我实际上是APM的用户,前面大家的思路都是如何实现,在腾讯这边他们也是APM的用户,只不过最终自己来解决问题.我自己并不是做互联网技术的公司,我们是一个做业务型的公司,但是我是业务型公司里面的运维,我要保证我们的公司能够很好卖业务的时候才选择了技术. 我今天来的时候碰到了一个情况,和我今天讲的这个事情其实有关系.来

【转】【Stackoverflow好问题】去掉烦人的“!=null&quot;(判空语句)

[Stackoverflow好问题]去掉烦人的“!=null"(判空语句) 问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) {   someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 精华回答: 这是初.中级程序猿经常会遇到的问题.他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空.另外,也许受此习惯影响,他们总潜意识地认为,所有的返

利用简洁的图片预加载组件提升h5移动页面的用户体验

在做h5移动页面,相信大家一定碰到过页面已经打开,但是里面的图片还未加载出来的情况,这种问题虽然不影响页面的功能,但是不利于用户体验.抛开网速的原因,解决这个问题有多方面的思路:最基本的,要从http请求合并,缓存管理,图片压缩等方面做性能优化:另外就是可以对页面里用到的所有图片做预加载的处理,当用户打开页面的时候不立即显示第一屏,而是先显示资源加载效果,等到加载完毕,再来显示页面的主内容,这样就能解决那个问题.虽然这种加载效果占用了用户的浏览时间,但是我们可以把它做的好看有趣一点,所以也不会影

ASP.NET Core API 接收参数去掉烦人的 [FromBody]

在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody]属性才获取到.但是我看微软官方文档演示代码中并没有添加[FromBody],难道是微软官方文档写错了,按道理应该不会.Google里看到一片篇文章里的一个细节,又追回微软官方文档发现可行,于是记下去掉这个烦人的[FromBody]过程 修改之前测试 后台通过Visual Studio生成ASP.N

StackOverflow之旅&lt;1&gt;------{去掉烦人的&quot;!=null&quot;判断}

问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc(); } 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 回答 这是初.中级程序猿经常会遇到的问题.他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空.另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空. 吐槽完毕,回到这个题目本身,进行判空前,

【Stackoverflow好问题】去掉烦人的“!=null&quot;(判空语句)

问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) { someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 精华回答: 这是初.中级程序猿经常会遇到的问题.他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空.另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空. 吐槽完毕,回到这个题目本

StackOverflow经典问题:代码中如何去掉烦人的“!=null&quot;判空语句

问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc();} 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 回答 这是初.中级程序猿经常会遇到的问题. 他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空. 另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空. 吐槽完毕,回到这个题目本身,进行判空前

zabbix监控mysql自定义脚本如何去掉烦人的Warning反馈

脚本中连接数据的shell语句 MYSQL_USER='zabbix' MYSQL_PWD='123456' MYSQL_HOST='127.0.0.1'  MYSQL_PORT='3306' MYSQL_CONN="/usr/local/mysql/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST}" -P${MYSQL_PORT}" 一开始使用这种方法写的但是会出现Warning: Using a p

Xcode的编辑利器Xvim,如何去掉烦人工具栏和文件路径

最近网上看到了一篇关于Xcode的编辑利器,因为以前做FPGA工作时候在ISE SDK下用过vim作为编辑器,所以深知vim的强大,所以安装Xvim: 在安装之后遇到一些配置问题,因为本来就完美控制,所以...折腾了一个晚上终于把Xvim配置成我喜欢的环境,希望能帮助到有同样问题的朋友: 在OSX和Linux 下 <.文件>文件表示的是隐藏文件,所以要显示隐藏文件要用 ls -All ; 配置版本      :Xcode 5.1,Xcode 6.01 OSX版本     : 10.9.4 教程