我使用以下代码在出现任何未处理的异常时自动重新启动我的应用。
private Thread.UncaughtExceptionHandler onCrashRestart = new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread thread, Throwable ex) {
LOGGER.error("Unhandled Runtime exception occured ", ex);
LOGGER.info("Restarting app in 5 seconds");
Intent crashedIntent = new Intent(getApplicationContext(), RegisterActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, crashedIntent, 0);
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 5000, pendingIntent);
System.exit(2);
}
};
在活动onCreate
中:
Thread.setDefaultUncaughtExceptionHandler(onCrashRestart);
这是按预期工作的。但是,我亲眼目睹了我的应用程序被杀死而没有来到这个处理程序的情况。我在日志中也看不到任何崩溃异常,我在设备的SD卡内维护。
尝试多次黑客攻击后,我停止了应用程序内的所有sqlite数据库操作,此意外崩溃已经停止。
我的问题是,是否有任何已知的情况下android杀死了应用程序并且在崩溃时没有任何例外?
此外,在什么情况下android会在前台运行时杀死应用程序?
编辑: 我在我的应用程序中使用Renderscript apis进行Bitmap操作。在模拟器中运行时,会出现以下错误:
09-01 15:04:46.866 4624-9767/? E/RenderScript: rsAssert failed: ret == bytes || mShutdown, in frameworks/rs/rsFifoSocket.cpp at 83
09-01 15:04:46.878 4624-9758/? E/RenderScript: rsAssert failed: ret == bytes || mShutdown, in frameworks/rs/rsFifoSocket.cpp at 83
09-01 15:04:46.882 4624-9610/? E/RenderScript: rsAssert failed: ret == bytes || mShutdown, in frameworks/rs/rsFifoSocket.cpp at 83
09-01 15:04:46.914 4624-9758/? E/RenderScript: rsAssert failed: ret == bytes || mShutdown, in frameworks/rs/rsFifoSocket.cpp at 83
09-01 15:04:46.934 4624-9781/? E/RenderScript: rsAssert failed: ret == bytes || mShutdown, in frameworks/rs/rsFifoSocket.cpp at 83
....
这可能是罪魁祸首吗?
答案 0 :(得分:0)
应用程序如果在本机代码中崩溃,则Java异常不适用。在一个这样的实例中使用Renderscript支持库。通常,这些都很难调试。
阅读 - Catching exceptions thrown from native code running on Android处理相同内容。