Android去除烦人的默认闪退Dialog_Android

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

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

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

去除Dialog
Android系统默认设置了一个UnCaughtExceptionHandler,而弹出闪退弹窗的工作就是在这个handler做的。所以如果要去除弹窗,只要实现一个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或者弹出自定义弹窗。

 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
alertdialog闪退、jquery dialog闪退、android dialog闪退、showdialog 闪退、dialog去除边框,以便于您获取更多的相关知识。

时间: 2024-09-17 04:13:39

Android去除烦人的默认闪退Dialog_Android的相关文章

Android去除烦人的默认闪退Dialog

安卓应用闪退后总会出现一个"抱歉,App已经停止运行"的弹窗,这样的用户体验并不好.很多大厂的App都去除了这个弹窗,因此本文主要介绍如何去除默认闪退弹窗,以及在闪退时做一些必要的善后工作. UnCaughtExceptionHandler UnCaughtExceptionHandler能够在Thread遇到未catch住的Exception而终止前做一些善后工作.但是它无法阻止线程停止运行,线程最后还是要退出. Thread.setDefaultUncaughtExceptionH

如何去除烦人的网页广告和视频广告?

如何去除烦人的网页广告和视频广告? 首先,对于页面上的广告,我们主要使用 Adblock Plus 来解决. 使用方法如下: IE 浏览器: 这是使用 Windows 最常用的浏览器,所以就先从这款浏览器开始. 第一步:百度搜索"Adblock Plus",进入其官网. 点击[安装到 Internet Explorer],即可下载‍ Adblock Plus . 安装 Adblock Plus , 安装完成之后,打开 Internet Explorer 浏览器,浏览器下方会出现载入加载

求教-怎么去除烦人的优酷广告

问题描述 怎么去除烦人的优酷广告 求大神指导去除优酷广告的方法求大神指导去除优酷广告的方法求大神指导去除优酷广告的方法 解决方案 成为VIP会员即可- - 解决方案二: 交钱 变会员 交钱 变会员 解决方案三: 跟楼主一样的心情啊,同求!!! 解决方案四: http://jingyan.baidu.com/article/d8072ac427d35aec95cefd36.html 解决方案五: 下载个客户端看视频好像没有广告 解决方案六: 用ABP之类的广告屏蔽软件可以屏蔽,但貌似还要等广告时间

android listview setAdapter()方法导致闪退

问题描述 android listview setAdapter()方法导致闪退 代码如下,想要实现点击一个checkBox之后,弹出一个dialog,其中用listview来显示带有图标和应用信息的列表,但是运行之后会闪退,提示 listview.setAdapter(browseAppAdapter); 这行代码空指针错误,求解 checkBox.setOnClickListener(new OnClickListener() { @Override public void onClick(

后台-android应用在按Listview时闪退

问题描述 android应用在按Listview时闪退 这是应用的界面 按下ListView中的一条记录后闪退 后台报错的文字 报错所对应的源码 解决方案 空指针,你访问的对象为空,你调试一下就行了 解决方案二: 同意楼上,一般listView都会出现空指针这种问题,在适配器里面做个判断,防止其出现空就好了 解决方案三: 看一下cursor是不是被关闭或者没初始化,空指针了. 解决方案四: 59行,cursor是空值 解决方案五: 一种过来人的意见,遇到这种常见的错误类型,而且自己找不到错误原因

雷霆战机战队闪退进不去怎么办 雷霆战机战队闪退进不去解决办法

解决办法有几种 1.重新安装最新版本的游戏我们可以清除游戏数据删除游戏再重新安装 2.看看是不是与其它软件充突了,我们可以尝试关闭手机中其它软件的进程 来试一下. 3.安全管家之类的软件这个有可能,我们退出它们试一下. 4.重启手机了,有时智能手机重启是万能的哦.

代码-android关于调用系统相机拍照后APP闪退的问题

问题描述 android关于调用系统相机拍照后APP闪退的问题 最近在写一个小APP,就是调用系统相机拍照,然后保存在本地相册,代码没有显示bug,但是在调试时出现了拍照后闪退的问题,我的测试机是小米2S,MIUI 7系统,android5.0.X的,拍照的照片能保存在本地,但是在拍照后点击确定后软件就闪退了,这是我的代码 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

Android实现分享微信好友及出现闪退的解决办法_Android

 1.申请微信APPID 要实现分享到微信的功能,首先要到微信开放平台申请一个APPID.但在申请APPID的时候需要填写一个应用签名和应用包名.需要注意的是包名必须与开发应用时的包名一致,应用签名也必须去掉冒号而且字母为小写. 2.应用签名的获取 开发android应用的人很多,很有可能类名.包名起成了同一个名字,签名这时候就起到区分的作用. 所有的Android应用都必须有数字签名,不存在没有数字签名的应用,包括模拟器运行的.模拟器开发环境,开发时,通过ADB接口上传的程序会自动被签有Deb

Android实现分享微信好友及出现闪退的解决办法

1.申请微信APPID 要实现分享到微信的功能,首先要到微信开放平台申请一个APPID.但在申请APPID的时候需要填写一个应用签名和应用包名.需要注意的是包名必须与开发应用时的包名一致,应用签名也必须去掉冒号而且字母为小写. 2.应用签名的获取 开发android应用的人很多,很有可能类名.包名起成了同一个名字,签名这时候就起到区分的作用. 所有的Android应用都必须有数字签名,不存在没有数字签名的应用,包括模拟器运行的.模拟器开发环境,开发时,通过ADB接口上传的程序会自动被签有Debu