Android处理应用崩溃异常并重启应用

来源:互联网 发布:replay直播软件 编辑:程序博客网 时间:2024/05/17 02:36

Android处理应用崩溃异常并重启应用

实现的功能:
    在程序出现异常导致崩溃时,能够拦截异常,将崩溃日志保存在本地或者上传至服务器保存,同时可以重启应用。
直接上代码:
继承Application的类CatchExcep:
package com.mytest;import java.util.ArrayList;import android.app.Activity;import android.app.Application;public class CatchExcep extends Application{          ArrayList<Activity> list = new ArrayList<Activity>();      @Override    public void onCreate() {    super.onCreate();    init();    }          public void init(){          //设置该CrashHandler为程序的默认处理器            UnCeHandler catchExcep = new UnCeHandler(this);        Thread.setDefaultUncaughtExceptionHandler(catchExcep);    }            /**      * Activity关闭时,删除Activity列表中的Activity对象*/      public void removeActivity(Activity a){          list.remove(a);      }            /**      * 向Activity列表中添加Activity对象*/      public void addActivity(Activity a){          list.add(a);      }            /**      * 关闭Activity列表中的所有Activity*/      public void finishActivity(){          for (Activity activity : list) {                if (null != activity) {                    activity.finish();                }            }          //杀死该应用进程         android.os.Process.killProcess(android.os.Process.myPid());        }  }  

实现UncaughtExceptionHandler接口的类:UnCeHandler
package com.mytest;import java.lang.Thread.UncaughtExceptionHandler;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.os.Looper;import android.util.Log;import android.widget.Toast;import com.jingchen.timerpicker.MyTestActivity;public class UnCeHandler implements UncaughtExceptionHandler {          private Thread.UncaughtExceptionHandler mDefaultHandler;        public static final String TAG = "CatchExcep";      CatchExcep application;            public UnCeHandler(CatchExcep application){           //获取系统默认的UncaughtException处理器             mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();           this.application = application;      }        @Override      public void uncaughtException(Thread thread, Throwable ex) {            if(!handleException(ex) && mDefaultHandler != null){           System.out.println("!handleException(ex) && mDefaultHandler != null");            //如果用户没有处理则让系统默认的异常处理器来处理                mDefaultHandler.uncaughtException(thread, ex);                        }else{                     try{                Thread.sleep(2000);                }catch (InterruptedException e){                Log.e(TAG, "error : ", e);                }                 Intent intent = new Intent(application.getApplicationContext(), MyTestActivity.class);              PendingIntent restartIntent = PendingIntent.getActivity(                        application.getApplicationContext(), 0, intent,                        Intent.FLAG_ACTIVITY_NEW_TASK);                                                             //退出程序                                  AlarmManager mgr = (AlarmManager)application.getSystemService(Context.ALARM_SERVICE);                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,                        restartIntent); //1秒钟后重启应用               application.finishActivity();          }        }            /**       * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.       * @param ex       * @return true:如果处理了该异常信息;否则返回false.       */        private boolean handleException(Throwable ex) {            if (ex == null) {                return false;            }            //使用Toast来显示异常信息            new Thread(){                @Override                public void run() {                    Looper.prepare();                    Toast.makeText(application.getApplicationContext(), "很抱歉,程序出现异常,即将退出.",                           Toast.LENGTH_SHORT).show();                    Looper.loop();                }           }.start();            return true;        }    }  

com.jingchen.timerpicker.MyTestActivity:
package com.jingchen.timerpicker;import android.app.Activity;import android.os.Bundle;import android.view.View;import com.example.mywebview.R;public class MyTestActivity extends Activity {private String s = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mylayout);}public void click(View v){System.out.println(s);}}

AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.mywebview"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="19" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.RECEIVE_SMS" >    </uses-permission>    <uses-permission android:name="android.permission.READ_SMS" />    <uses-permission android:name="android.permission.READ_CONTACTS"/>    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>    <application        android:name="com.mytest.CatchExcep"        android:allowBackup="false"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:persistent="true"        android:theme="@style/AppTheme" >         <activity            android:name="com.jingchen.timerpicker.MyTestActivity"            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>

                                             
0 0
原创粉丝点击