原文地址:http://blog.csdn.net/jdsjlzx/article/details/7606423
写这篇文章主要是解决网友所说的原文程序一直Toast,而没有退出程序的问题。以下我是通过AppManager管理类的方法添加和结束Activity。
在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);
}
}
在CrashHandler.java代码中,代码是这样写的:
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;
}
}
在
AppManager
.java代码中,代码是这样写的:
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());
}
}