android遇到异常自动重启代码

原创 2017年05月03日 10:30:51

先说下为什么要有这个功能

主流的Android版本 如果不人为通过Thread.setDefaultUncaughtExceptionHandler干预异常,系统会关闭当前线程并使用新线程重启应用,而应用并不是从LauncherActivity启动的,而是回退栈中抛出异常的Activity的下面的Activity,比如从MainActivity启动了DiscountActivity,在DiscountActivity抛出了异常,系统会调用MainActivity的onCreate.(这是我通过现象分析的,没有任何根据)

我的项目是个管理类的app,并且没有使用token的方式存储用户信息,一切网络请求通过cookie判断用户是否登录

在系统抛出异常开启新线程后 网络请求不会携带旧线程的cookie,导致返回到MainActivity时的一切网络请求都是非法的,因此只有进入到MainActivity前面打的LoginActivity重新登录才能重新得到cookie从而解决问题.

所以用到了这个功能:android遇到异常自动重启 一切重头再来


再说下这个功能涉及的知识点

这是个涵盖多个知识点的综合性的功能 核心功能有两点:

1.关闭当前线程

2.重启应用

其他附属的功能还可能有

记录日志 弹出友好的提示信息等等


关于这核心的两点 网上关于这个功能的文章很多 也有各种写法,其中一些写法可能是因为Android版本的升级的原因现在已经不再正确

关闭线程有用list记录活动的Activity,退出时循环执行finish的 

也有只通过这一句代码关闭线程的

android.os.Process.killProcess(android.os.Process.myPid()); 
经我测试第二种办法就可实现关闭线程的目的

再说重启应用 分至少三种写法
1.
Intent intent = new Intent(this, getTopActivity());  
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |  
                Intent.FLAG_ACTIVITY_NEW_TASK);  
        startActivity(intent);  

 2.
Intent intent = new Intent(mContext, MainActivity.class);
                    PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
                    AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
                    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent);

 3.
AlarmManager mgr = (AlarmManager) mAppContext.getSystemService(Context.ALARM_SERVICE);  
            Intent intent = new Intent(mAppContext, WelcomeActivity.class);  
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
            intent.putExtra("crash", true);  
            PendingIntent restartIntent = PendingIntent.getActivity(mAppContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);  
            mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); 
首先第一种写法在当前Android版本下是错的 无法实现重启应用的目的
接着第二种写法估计也是过时的写法 PendingIntent.getActivity的最后一个参数不正确  
只有最后一个写法才是对的 把Intent.FLAG_ACTIVITY_NEW_TASK 设置到intent里

特此总结,记录自己遇到过的坑,也希望对后来者有所帮助
最后贴上一个完整可用的版本点击打开链接

Android 开机自动重启App代码

如果在手机上,需要在设置里设置允许开机自动启动。 如果在其它手持设备上,如PDA,可直接使用(如不行,则需要去设置里看看)。 在红米note2和手持PDA中测试可行。 第一需要手动启动下App。...
  • u010997144
  • u010997144
  • 2016年11月24日 15:54
  • 906

app崩溃后捕获异常或自动重启

假如你开发的app有这个需求的话:崩溃后自动重启。你可以参照下文:
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2014年11月16日 23:20
  • 17378

Android Activity自动重启的问题

Android一个Activity自动重启引发的抓狂
  • feer921
  • feer921
  • 2016年03月17日 17:49
  • 2886

MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈

MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈   2013-09-11 09:39:04|  分类: VS编译集合|举报|字号 订阅      ...
  • boshuzhang
  • boshuzhang
  • 2016年07月29日 19:54
  • 1541

Android-开发遇到的问题汇总

开发过程遇到的问题整理。
  • qq378532177
  • qq378532177
  • 2015年09月18日 16:35
  • 710

系统自动重启异常-总结网上看到的博文

watchdog timeout 有两种,一种是cpu的watchdog timeout,称为HWT(hardware timeout),SWT(software timeout)。 监测cpu的wa...
  • b1480521874
  • b1480521874
  • 2017年12月19日 11:28
  • 41

夜里服务器自动重启

近期服务器自动重启,查看日志如下: 日志名称:          System 来源:            USER32 日期:            2014/8/7 3:15:10 事件 ID:...
  • levy_cui
  • levy_cui
  • 2016年04月13日 10:21
  • 1331

监视Python程式自动退出,并重新启动程式

有时,我们会遇到Python程式莫名其妙地退出,也没有任何异常提示,但我们希望程式能够一直运行,即便异常终止,也能自动启动,这时我们可以写一个监视程式,来达到目的:   # -*- coding:...
  • Burgess_Liu
  • Burgess_Liu
  • 2013年08月29日 18:22
  • 4789

Activity莫名自动重启问题调查

android异常分析
  • sarsscofy
  • sarsscofy
  • 2017年02月10日 11:08
  • 1382

android app崩溃后自动重启

1.偶然发现项目因为一场崩溃后,自动重启到上一界面。因为未知原因,重启后fragment显示有误,需要杀死进程后才能正常适应app。悲剧的是,因为马上就重启进程 了,导致LOG中看不到异常原因。非常不...
  • hunanqi
  • hunanqi
  • 2017年07月05日 13:51
  • 1026
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android遇到异常自动重启代码
举报原因:
原因补充:

(最多只允许输入30个字)