原文地址:http://blog.csdn.net/u012516952/article/details/50504610
在MainActivity.java代码中,代码是这样写的:
- package com.example.crash;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private TextView tv_hello;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- AppManager.getAppManager().addActivity(this);
- tv_hello=(TextView) findViewById(R.id.tv_hello);
- tv_hello.setText(1);
- }
- }
- package com.example.crash;
- import java.lang.Thread.UncaughtExceptionHandler;
- import android.content.Context;
- import android.os.Looper;
- import android.widget.Toast;
- public class CrashHandler implements UncaughtExceptionHandler{
- //系统默认的UncaughtException处理类
- private Thread.UncaughtExceptionHandler mExceptionHandler;
- //CrashHandler实例
- private static CrashHandler INSTANCE=new CrashHandler();
- private Context mContext;
- //保证只有一个CrashHandler实例
- private CrashHandler (){
- }
- public static CrashHandler getInstance(){
- return INSTANCE;
- }
- public void init(Context context){
- mContext=context;
- //获取系统默认的UncaughtException处理器
- mExceptionHandler =Thread.getDefaultUncaughtExceptionHandler();
- //设置该CrashHandler为程序的默认处理器
- Thread.setDefaultUncaughtExceptionHandler(this);
- }
- @Override
- public void uncaughtException(Thread thread, Throwable ex) {
- if(!handleException(ex) && mExceptionHandler!=null){
- mExceptionHandler.uncaughtException(thread, ex);
- }else {
- try {
- Thread.sleep(3000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- AppManager.getAppManager().finishAllActivity();
- }
- }
- private boolean handleException (Throwable throwable){
- if(throwable==null){
- return false;
- }
- new Thread(new Runnable() {
- @Override
- public void run() {
- Looper.prepare();
- Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_SHORT).show();
- Looper.loop();
- }
- }){
- }.start();
- return true;
- }
- }
- package com.example.crash;
- import java.util.Stack;
- import android.app.Activity;
- /*
- * 应用程序Activity管理类:用于Activity管理和应用程序退出
- */
- public class AppManager {
- private static Stack<Activity> activityStack;
- private static AppManager instance;
- public AppManager() {}
- public static AppManager getAppManager(){
- if(instance==null){
- instance=new AppManager();
- }
- return instance;
- }
- //添加Activity到堆栈
- public void addActivity(Activity activity){
- if(activityStack==null){
- activityStack=new Stack<Activity>();
- }
- activityStack.add(activity);
- }
- public void finishAllActivity(){
- for(int i=0;i<activityStack.size();i++){
- if(activityStack.get(i) != null){
- activityStack.get(i).finish();
- }
- }
- activityStack.clear();
- }
- }
在 AndroidManifest.xml 代码中,代码是这样写的:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.crash"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="17"
- android:targetSdkVersion="21" />
- <application
- android:name="com.example.crash.CrashApplication"
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.crash.MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
在 CrashApplication 代码中,代码是这样写的:
- package com.example.crash;
- import android.app.Application;
- public class CrashApplication extends Application{
- @Override
- public void onCreate() {
- super.onCreate();
- CrashHandler crashHandler=CrashHandler.getInstance();
- crashHandler.init(getApplicationContext());
- }
- }