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
- Android处理应用崩溃异常并重启应用
- android 崩溃 重启 捕获异常 并重启应用
- Android应用崩溃后异常捕获并重启
- Android应用崩溃后异常捕获并重启
- Android应用崩溃后异常捕获并重启
- Android应用崩溃后异常捕获并重启
- Android应用崩溃后异常捕获并重启
- [转]Android应用崩溃后异常捕获并重启
- 【知识必备】如何优雅的退出应用和处理崩溃异常并重启
- android自定义异常,并重启应用
- Android学习之 应用崩溃异常处理
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- Android Studio集成crashlytics后无法编译的问题
- 自动填写获取到的短信验证码
- Java继承和多态===Java继承中方法的覆盖和重载
- 学习笔记:HTML DOM(文档对象模型)
- leetcode 之ugly number
- Android处理应用崩溃异常并重启应用
- 【C++】优先队列priority_queue
- 简单并查集 hdu 1233 ( 还是畅通工程 )
- 自学c语言第二个/除
- Objective-C自定义UITabBar位置
- Windbg调试.net程序(1)准备工作
- Android学好Shape不再依赖美工
- SpringMVC和Spring的整合问题
- 生态链的设想和雷军的新国货理念