英文原文: 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)之后如何让它自动重启?...相关推荐

  1. android程序安装后图标不显示

    本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中..一般这种情况只会在服务 ...

  2. Android程序安装后应用图标不显示

    原文地址:http://trinea.iteye.com/blog/1463296 本文主要介绍android应用程序安装后图标不显示的几个可能原因. 自己写的程序突然安装后图标不见了,在应用程序安装 ...

  3. Android程序员必看,Android系统面试题

    开头 移动应用开发从逐渐开始火爆到如今也有小十年了,大部分的学校还是没有开放专门的课程. 目前市场上的大部分 Android 开发工程师大多数是自学或者是培训出身,用一段时间上手 Android 开发 ...

  4. android程序键盘锁_适用于Android的最佳键盘应用程序

    android程序键盘锁 The interactions you have with your phone's keyboard are easily some of the most intima ...

  5. Android程序 地图,在定制的Android应用程序中使用谷歌地图

    我收到以下问题(显示在LogCat中).我希望any1可以帮助我,因为我是android应用程序开发的新手.在定制的Android应用程序中使用谷歌地图 11-17 16:50:38.087: E/A ...

  6. 尝试使用Visual studio编写Android程序C++的跨平台开发Android

    说明: 作为Visual studio的老粉丝,从98版追到2013版,至今重新打开熟悉的页面,就像回到了多年前. 早就听说vs可以编写android程序,以前一直没机会,趁现在无事可做,想看看到底现 ...

  7. android应用程序开发答案,第1章 Android概述--1.2 Android程序【含答案】 Android应用开发基础...

    (1)单选题 1 Android程序启动最先加载AndroidManifest.xml文件,如果有多个Activity,请问()属性决定了Activity最先被加载? A  android.inten ...

  8. android程序退出时回调,关于android:通过刷卡杀死App时的回调

    我有一个涉及导航的应用程序. 如果用户启动导航,则会创建一种"navigationLifecycleManager".它存储在应用程序实例中,以便在配置更改,活动等之间切换时幸免于 ...

  9. android程序安装目录在哪里,Android app 安装目录知识

    我们都知道android app有两个安装路径,一个是system/app目录,这个就是所谓的系统应用,只有获得root权限才能删除这个目录下的应用,另一个是data/app目录,用户安装的应用都在这 ...

最新文章

  1. Linux系统下如何安装软件包
  2. Oracle ASM 翻译系列第二十七弹:ASM INTERNAL ASM METADATA BLOCK
  3. eclipse--各类型版本包含插件比较
  4. angular ngClick 阻止冒泡和默认行为
  5. Unable to load the Wrapper's native library because none of the following files及解决方法
  6. 获取和设置c# 应用程序目录
  7. Ansible结合跳板机控制远程服务器
  8. 关系型数据库知识小结
  9. 解决listview点击item失效
  10. jfinal中Interceptor拦截器的使用
  11. Java版通用身份证验证
  12. python 分词器使用
  13. Linux系统用户详细介绍
  14. TensorFlow 如何在上次模型训练结果之上继续训练
  15. 京东零售大数据云原生平台化实践
  16. 外网下载速度过慢问题解决办法
  17. Bellman-Ford算法图解及手算过程详解 —— C++代码实现
  18. GPRS电力远程自动抄表系统解决方案
  19. Docker安装Grafana
  20. 硬件服务器搭建系统步骤,服务器硬件部署方案

热门文章

  1. windows10安装mysql
  2. 注册破解加暗桩去除下篇去除暗桩部分
  3. opencv_python:cv2.flip() 图像翻转函数
  4. 读《微软的秘密》,想《走出软件作坊》
  5. Type-C协议简介(CC检测原理)
  6. matlab氢原子杂化轨道,用matlab实现氢原子的sp杂化轨道可视化
  7. 身份证验证函数,可查看身份证地区信息
  8. Consul 之 Watch
  9. 甘肃回应“万名考试作弊猖狂”:不存在考题泄露
  10. MOOC程序设计入门——C语言(翁恺)第五周编程作业“念整数”