APP崩溃后自动重启

原文参考自:http://blog.csdn.net/cym_lmy/article/details/24704089

程序很难做到完美,有时你也不知道因为什么原因会导致APP崩溃,这让用户体验很不好,我们可以采用重启机制,就是当APP由于某种原因崩溃时为了更好地用户体验让APP重启,思路是:由于APP崩溃后进程会被杀死,所以使用系统异常来进行捕获,并处理异常崩溃。

java中UncaughtExceptionHandler这个接口,android沿用了此接口,我们可以采用实现这个接口来实现这个功能。

demo如下:

xml:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <TextView 
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="我要崩溃咯"
        android:textSize="20sp"/>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/show"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:padding="10dp"
        android:text="点我崩溃" />

</RelativeLayout>


MainActivity:

package com.lzy.gesture;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private Button mButton;
	private TextView mTextView;
	private MyApplication myApplication;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		myApplication = (MyApplication) getApplication();
		myApplication.init();
		myApplication.addActivity(this);
		
		mButton = (Button) findViewById(R.id.btn);
		mTextView = (TextView) findViewById(R.id.show);

		mButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				pressed();
			}

		});
	}
//人工制造异常崩溃
	private void pressed() {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				mTextView.setText("beng...");
			}
		}).start();

	}
}


MyApplication:在启动APP的时候一直开启application用于监听异常

package com.lzy.gesture;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

public class MyApplication extends Application {
	
	List<Activity> list = new ArrayList<Activity>();
	
	public void init(){  
        //设置该CrashHandler为程序的默认处理器    
        MyUncaughtExceptionHandler catchException = new MyUncaughtExceptionHandler(this);  
        Thread.setDefaultUncaughtExceptionHandler(catchException);   
    }  
      
    /** 
     * 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());    
    }  
}


MyUncaughtExceptionHandler:处理崩溃异常

package com.lzy.gesture;

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.widget.Toast;

public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {

	private MyApplication myApplication;
	private Thread.UncaughtExceptionHandler mUncaughtExceptionHandler;
	
	public MyUncaughtExceptionHandler(MyApplication myApplication) {
		this.myApplication = myApplication;
		mUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的异常处理器
	}
	
	@Override
	public void uncaughtException(Thread thread, Throwable ex) {
		if (!handleException(ex) && mUncaughtExceptionHandler != null) {
			//如果用户没有处理则让系统默认的异常处理器来处理   
			mUncaughtExceptionHandler.uncaughtException(thread, ex);
		}else {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Intent intent = new Intent(myApplication.getApplicationContext(), MainActivity.class);
			//重启应用,得使用PendingIntent
            PendingIntent restartIntent = PendingIntent.getActivity(    
            		myApplication.getApplicationContext(), 0, intent,    
                    Intent.FLAG_ACTIVITY_NEW_TASK);                                                 
            //退出程序                                          
            AlarmManager mAlarmManager = (AlarmManager) myApplication.getSystemService(Context.ALARM_SERVICE);    
            mAlarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000,    
                    restartIntent); // 1秒钟后重启应用   
            myApplication.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(myApplication.getApplicationContext(), "很抱歉,程序出现异常,一秒钟后重启.",   
                        Toast.LENGTH_SHORT).show();    
                Looper.loop();    
            }   
        }.start();    
        return true;    
    }    
}


刚开始碰到了

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lzy.gesture/com.lzy.gesture.MainActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.lzy.gesture.MyApplication

的报错,原来是忘了在manifast中application节点添加MyApplication了。如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lzy.gesture"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        android:name="com.lzy.gesture.MyApplication">
        <activity
            android:name=".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>


ok,功能完成!

【欢迎上码】

【微信公众号搜索 h2o2s2】

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过捕获全局异常来实现APP崩溃后的重新启动。具体实现步骤如下: 1. 创建一个自定义的Application类,并在onCreate()方法中设置UncaughtExceptionHandler(全局异常处理器)。 ```java public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); } } ``` 2. 实现UncaughtExceptionHandler接口,重写uncaughtException()方法,在该方法中处理异常信息并重启APP。 ```java public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { // 处理异常信息 Log.e("MyUncaughtExceptionHandler", "uncaughtException: " + e.getMessage()); // 重启APP Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); PendingIntent pendingIntent = PendingIntent.getActivity( getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000, pendingIntent); // 结束进程 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } ``` 在uncaughtException()方法中,首先处理异常信息,然后通过AlarmManager和PendingIntent实现重启APP的功能,最后通过killProcess()和System.exit()方法结束进程。 3. 在AndroidManifest.xml文件中注册自定义的Application类。 ```xml <application android:name=".MyApplication" ... </application> ``` 通过以上步骤,即可实现APP崩溃后的自动重启

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值