Android去除烦人的默认闪退Dialog

Android去除烦人的默认闪退Dialog,第1张

概述安卓应用闪退后总会出现一个“抱歉,App已经停止运行”的d窗,这样的用户体验并不好。很多大厂的App都去除了这个d窗,因此本文主要介绍如何去除默认闪退d窗,以及在闪退时做一些必要的善后工作。

安卓应用闪退后总会出现一个“抱歉,App已经停止运行”的d窗,这样的用户体验并不好。很多大厂的App都去除了这个d窗,因此本文主要介绍如何去除默认闪退d窗,以及在闪退时做一些必要的善后工作。

UnCaughtExceptionHandler
UnCaughtExceptionHandler能够在Thread遇到未catch住的Exception而终止前做一些善后工作。但是它无法阻止线程停止运行,线程最后还是要退出。

 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {   @OverrIDe   public voID uncaughtException(Thread thread,Throwable ex) {    System.exit(1);   }  });

去除Dialog
AndroID系统默认设置了一个UnCaughtExceptionHandler,而d出闪退d窗的工作就是在这个handler做的。所以如果要去除d窗,只要实现一个UnCaughtExceptionHandler并替换掉系统默认的就可以了,代码如下。

public class App extends Application { @OverrIDe public voID onCreate() {  super.onCreate();  Thread.setDefaultUncaughtExceptionHandler(new MyUnCaughtExceptionHandler()); } class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{  @OverrIDe  public voID uncaughtException(Thread thread,Throwable ex) {   ex.printstacktrace();   // do some work here  androID.os.Process.killProcess(androID.os.Process.myPID());   System.exit(1);  } }}

以上的替换UnCaughtExceptionHandler的工作是在Application中统一做的,当然你也可以在每一个Activity中做。对于单个Activity还好,当Activity很多的时候就必需实现一个BaseActivity,在BaseActivity中替换,其它Activity要集成BaseActivity。

必要的善后工作
为了处理闪退,提升用户体验,有必要做一些善后工作,主要有几条罗列如下:

异常上报
可以采用邮件或者通过服务器接口上传的方式。两者各有优缺点,邮件方式开发简单,但需要用户额外 *** 作,用户体验较差。如果用上传服务器方式,因为在UnCaughtExceptionHandler中不能打开一个新的线程,所以只能同步请求,在网络情况不好的时候花费时间会较长而阻塞运行。也可能因为网络原因而上报失败。当然总体下来还是上传服务器好一点。具体实现留给读者。

记录日志
将闪退信息存储到文件系统中。不能存到SharedPreferences中,因为打开SP需要使用一个新的线程(AndroID内部实现),而这在UnCaughtExceptionHandler中,这是不被允许的。

闪退三次清除数据
很多时候是由于后台返回数据错误导致的闪退。如果这些数据被缓存下来,那么用户即使再次打开还是会发生闪退,这时候就只能通过重装或者清除数据的方式才能解决闪退问题,用户体验十分不好。所以在多次闪退后自动清除缓存数据十分必要。具体实现可以参考我的另一篇博客AndroID实现多次闪退清除数据。不过该博客中使用的是ACRA,一个对UnCaughtExceptionHandler再次封装的开源项目,读者可以将ACRA替换为UnCaughtExceptionHandler来实现。

重新打开App
可以在UnCaughtExceptionHandler中重新打开App或者d出自定义d窗。

 class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{  @OverrIDe  public voID uncaughtException(Thread thread,Throwable ex) {   ex.printstacktrace();      Intent intent = new Intent(App.this,MainActivity.class);   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   App.this.startActivity(intent);   androID.os.Process.killProcess(androID.os.Process.myPID());   System.exit(1);  } }

注意setFlags这一步是必需的,因为使用的Context是App的Context,所以必需打开一个新的任务队列,否则打开Activity无法生效,如果你替换Handler是在Activity做的,拿到的Context是Activity的Context,则无需这一步。

注意事项
最主要的注意点我之前已经提到,不要在UnCaughtExceptionHandler中新开一个线程,会抛出异常。

以上就是本文的全部内容,希望对大家的学习有所帮助。

总结

以上是内存溢出为你收集整理的Android去除烦人的默认闪退Dialog全部内容,希望文章能够帮你解决Android去除烦人的默认闪退Dialog所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149459.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存