android 程序崩溃后自动重启,【Android】App应用崩溃(Crash/Force Close)之后如何让它自动重启?...
英文原文: Auto Restart application after Crash/Force Close in Android.
手机上的Android应用,经常会出现“Force Close”的错误,这种情况一般是因为代码中没有正确获取到Exceptions。那么如果想让App在出现这种错误崩溃Crash以后自动重启,我们该怎么办呢?
这篇教程我们将学到如何自动处理Exception,并且了解在App Crash以后如何自动重启。
其实方法很简单,这里我们需要用到 Thread.setDefaultUncaughtExceptionHandler(),当应用崩溃的时候代码就会自动调用 uncaughtException() 这个方法。
操作步骤如下:
Step 1
像下面这样创建一个重启目标 Activity 的 Intent,并添加一些 Activity 启动的 Flags:
Intent intent = new Intent(activity, RelaunchActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
其中,
Intent.FLAG_ACTIVITY_CLEAR_TOP : 销毁目标Activity和它之上的所有Activity,重新创建目标Activity。
Intent.FLAG_ACTIVITY_CLEAR_TASK : 启动Activity时,清除之前已经存在的Activity实例所在的task,这自然也就清除了之前存在的Activity实例!
Intent.FLAG_ACTIVITY_NEW_TASK : 很少单独使用,通常与FLAG_ACTIVITY_CLEAR_TASK或FLAG_ACTIVITY_CLEAR_TOP联合使用。
Step 2
在 uncaughtException() 方法中,添加如下代码:
PendingIntent pendingIntent = PendingIntent.getActivity(
YourApplication.getInstance().getBaseContext(), 0,
intent, intent.getFlags());
AlarmManager mgr = (AlarmManager) YourApplication.getInstance().getBaseContext()
.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 2000, pendingIntent);
activity.finish();
System.exit(2);
这里的 PendingIntent 不同于常见的 Intent ,PendingIntent 是对 Intent 的一个包装,可以保存下来在将来某一刻执行。它存储了request code、intent 和 flags。
AlarmManager 是为了设置一个计时器来延迟两秒再执行 pendingIntent 的,也就是重启我们的Activity的任务。
Step 3
最后,在 Activity 的 onCreate() 方法中调用如下代码:
Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler(this));
【完整代码】
YourApplication.java
import android.app.Application;
/**
* This custom class is used to Application level things.
*
*@author Chintan Rathod (http://www.chintanrathod.com)
*/
public class YourApplication extends Application {
private static Context mContext;
public static YourApplication instace;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
instace = this;
}
@Override
public Context getApplicationContext() {
return super.getApplicationContext();
}
public static YourApplication getIntance() {
return instace;
}
}
DefaultExceptionHandler.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import android.util.Log;
/**
* This custom class is used to handle exception.
*
*@author Chintan Rathod (http://www.chintanrathod.com)
*/
public class DefaultExceptionHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler defaultUEH;
Activity activity;
public DefaultExceptionHandler(Activity activity) {
this.activity = activity;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try {
Intent intent = new Intent(activity, RelaunchActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(
YourApplication.getInstance().getBaseContext(), 0, intent, intent.getFlags());
//Following code will restart your application after 2 seconds
AlarmManager mgr = (AlarmManager) YourApplication.getInstance().getBaseContext()
.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,
pendingIntent);
//This will finish your activity manually
activity.finish();
//This will stop your application and take out from it.
System.exit(2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
【参考资料】:
1、Activity启动模式(二)之 Intent的Flag属性
android 程序崩溃后自动重启,【Android】App应用崩溃(Crash/Force Close)之后如何让它自动重启?...相关推荐
- android程序安装后图标不显示
本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中..一般这种情况只会在服务 ...
- Android程序安装后应用图标不显示
原文地址:http://trinea.iteye.com/blog/1463296 本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装 ...
- Android程序员必看,Android系统面试题
开头 移动应用开发从逐渐开始火爆到如今也有小十年了,大部分的学校还是没有开放专门的课程. 目前市场上的大部分 Android 开发工程师大多数是自学或者是培训出身,用一段时间上手 Android 开发 ...
- android程序键盘锁_适用于Android的最佳键盘应用程序
android程序键盘锁 The interactions you have with your phone's keyboard are easily some of the most intima ...
- Android程序 地图,在定制的Android应用程序中使用谷歌地图
我收到以下问题(显示在LogCat中).我希望any1可以帮助我,因为我是android应用程序开发的新手.在定制的Android应用程序中使用谷歌地图 11-17 16:50:38.087: E/A ...
- 尝试使用Visual studio编写Android程序C++的跨平台开发Android
说明: 作为Visual studio的老粉丝,从98版追到2013版,至今重新打开熟悉的页面,就像回到了多年前. 早就听说vs可以编写android程序,以前一直没机会,趁现在无事可做,想看看到底现 ...
- android应用程序开发答案,第1章 Android概述--1.2 Android程序【含答案】 Android应用开发基础...
(1)单选题 1 Android程序启动最先加载AndroidManifest.xml文件,如果有多个Activity,请问()属性决定了Activity最先被加载? A android.inten ...
- android程序退出时回调,关于android:通过刷卡杀死App时的回调
我有一个涉及导航的应用程序. 如果用户启动导航,则会创建一种"navigationLifecycleManager".它存储在应用程序实例中,以便在配置更改,活动等之间切换时幸免于 ...
- android程序安装目录在哪里,Android app 安装目录知识
我们都知道android app有两个安装路径,一个是system/app目录,这个就是所谓的系统应用,只有获得root权限才能删除这个目录下的应用,另一个是data/app目录,用户安装的应用都在这 ...
最新文章
- Linux系统下如何安装软件包
- Oracle ASM 翻译系列第二十七弹:ASM INTERNAL ASM METADATA BLOCK
- eclipse--各类型版本包含插件比较
- angular ngClick 阻止冒泡和默认行为
- Unable to load the Wrapper's native library because none of the following files及解决方法
- 获取和设置c# 应用程序目录
- Ansible结合跳板机控制远程服务器
- 关系型数据库知识小结
- 解决listview点击item失效
- jfinal中Interceptor拦截器的使用
- Java版通用身份证验证
- python 分词器使用
- Linux系统用户详细介绍
- TensorFlow 如何在上次模型训练结果之上继续训练
- 京东零售大数据云原生平台化实践
- 外网下载速度过慢问题解决办法
- Bellman-Ford算法图解及手算过程详解 —— C++代码实现
- GPRS电力远程自动抄表系统解决方案
- Docker安装Grafana
- 硬件服务器搭建系统步骤,服务器硬件部署方案
热门文章
- windows10安装mysql
- 注册破解加暗桩去除下篇去除暗桩部分
- opencv_python:cv2.flip() 图像翻转函数
- 读《微软的秘密》,想《走出软件作坊》
- Type-C协议简介(CC检测原理)
- matlab氢原子杂化轨道,用matlab实现氢原子的sp杂化轨道可视化
- 身份证验证函数,可查看身份证地区信息
- Consul 之 Watch
- 甘肃回应“万名考试作弊猖狂”:不存在考题泄露
- MOOC程序设计入门——C语言(翁恺)第五周编程作业“念整数”