Android 的默认崩溃机制是 APP 闪退,然后显示一个【xxx 已停止运行】的对话框或 Toast,而崩溃的详情只有开发者在 Logcat 里才能看到,用户看到发生了这样的情况肯定一头雾水,的确,这样默认的异常处理方式很不友好,容易造成用户流失。我们现在要做的是,程序发生异常时,新开一个 Activity 向用户致歉,输出详细的异常信息,并提供将异常信息提交给开发者的功能。
首先,在 BaseActivity 里封装方法:
/**
* BaseActivity: 该抽象类定义所有活动均拥有的共同属性。
* 本 APP 中所有活动对象均继承此类。
*/
public abstract class BaseActivity extends AppCompatActivity {
private static final AppManager MANAGER = AppManager.get();
/**
* onCreate(): 重写父类的 onCreate() 方法,向应用管理器中添加本活动。
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MANAGER.addActivity(this);
} // onCreate()
/**
* onDestroy(): 重写父类的 onDestroy() 方法,从应用管理器中移除本活动。
*/
@Override
protected void onDestroy() {
super.onDestroy();
MANAGER.removeActivity(this);
} // onDestroy()
/**
* crash(): 捕获到非预期的异常后强制令程序崩溃。
*
* @param e 传入造成崩溃的异常对象。
*/
protected void crash(Exception e) {
Intent i;
String dump;
PrintWriter pw;
StringWriter sw;
sw = new StringWriter();
pw = new PrintWriter(sw);
e.printStackTrace(pw);
pw.flush();
dump = sw.toString();
i = new Intent(this, CrashActivity.class);
i.putExtra("dump", dump);
startActivity(i);
MANAGER.finishAllExcept(CrashActivity.class);
} // crash()
/**
* getCrashDump(): 仅限 CrashActivity 调用。
* 获得传入的 dump 信息。
*
* @return 传入的 dump 信息。
*/
String getCrashDump() {
return getIntent().getStringExtra("dump");
} // getCrashDump()
} // BaseActivity Abstract Class
// E.O.F
BaseActivity 里用到了两个自定义类,AppManager 和 CrashActivity。后面添加的这两个类请确保和 BaseActivity 在同一包下。
添加 AppManager 类:
/**
* AppManager: 用于对活动进行管理。该模块仅限 base 包内使用。
* 该模块为单一实例,您需要调用 AppManager.get() 获取实例后再调用方法。
* <p>
* 为确保应用管理器正常工作,请新建一个继承 Activity 的抽象类 BaseActivity,
* 然后重写 BaseActivity 类的 onCreate() 和 onDestroy() 方法。
* 请给 BaseActivity 类的 onCreate() 方法添加如下代码:
* AppManager.get().addActivity(this);
* 请给 BaseActivity 类的 onDestroy() 方法添加如下代码:
* AppManager.get().removeActivity(this);
* 最后ÿ