我使用在Application类中定义的自定义异常处理程序:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
StringWriter stackTrace = new StringWriter();
ex.printStackTrace(new PrintWriter(stackTrace));
StringBuilder errorReport = new StringBuilder();
errorReport.append("************ CAUSE OF ERROR ************\n\n");
errorReport.append(stackTrace.toString());
errorReport.append("\n************ DEVICE INFORMATION ***********\n");
errorReport.append("Brand: ");
errorReport.append(Build.BRAND);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Device: ");
errorReport.append(Build.DEVICE);
errorReport.append(LINE_SEPARATOR);
errorReport.append("Model: ");
errorReport.append(Build.MODEL);
errorReport.append(LINE_SEPARATOR);
File root = android.os.Environment.getExternalStorageDirectory();
String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date());
File dir = new File(root.getAbsolutePath() + "/.helper/crashes/");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, "log.txt");
try {
BufferedWriter buf = new BufferedWriter(new FileWriter(file, true));
buf.append(currentDateTimeString + ":" + errorReport.toString());
buf.newLine();
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
android.os.Process.killProcess(android.os.Process.myPid());
Runtime.getRuntime().exit(1);
}
});
在MainActivity中的OnCreate中,我模拟异常:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_root);
throw new NullPointerException("Example");
}
应用程序被杀死但立即重启。这种情况发生在无限。我做错了什么?
答案 0 :(得分:0)
我认为Android OS会解释它是活动中的崩溃。操作系统将自动重新创建活动。
在您的情况下,这是主要活动。
答案 1 :(得分:0)
这只是正常行为而你没有做错任何事。
您可以为清单中的活动设置android:finishOnTaskLaunch="true"
,以防止它重新启动(未经过测试,但可以在此处找到详细信息:http://developer.android.com/guide/topics/manifest/activity-element.html#finish)。
如果您查看Wildroid发布的答案,您还可以了解有关应用意外关闭时的情况:What happens when App crashes?。
答案 2 :(得分:0)
在我的情况下,我只是交换行:
android.os.Process.killProcess(android.os.Process.myPid());
Runtime.getRuntime().exit(1);
到
Runtime.getRuntime().exit(1);
android.os.Process.killProcess(android.os.Process.myPid());