未処理の例外が発生した場合、自動的に次のコードを使用してアプリを再起動します。活動onCreate
内予期せぬアンドロイドのアプリがクラッシュの例外なしで殺される
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);
}
};
:
これは期待通りに働いています。しかし、私はこのハンドラに来ることなく私のアプリが殺された事例を目撃しました。ログにクラッシュの例外がないことがわかりました。デバイスのSDカード内で維持しています。
複数のハッキングを試した後、私はapp内でsqliteデータベース操作をすべて停止しました。この予期しないクラッシュは以来停止しています。
私の質問は、アンドロイドがアプリを殺す既知のケースはありますか?クラッシュに関する例外はありませんか?
また、フォアグラウンドで実行中にアンドロイドがアプリを殺すのはどのような状況ですか?
編集: ビットマップ操作のために私のアプリケーション内でRenderscript apisを使用しています。エミュレータで実行中に、次のエラーが表示されます。
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
....
これが原因ですか?
「残念ながら、アプリが停止しました」というポップアップが表示されますか? – j2ko
いいえ、それは変です。もしそうであれば、上記のハンドラに来るでしょう。 – jay
アプリがネイティブコードでクラッシュする可能性があります。フィルタリングされていないlogcatでネイティブクラッシュダンプがないかチェックしてください。 Javaの例外はそこには適用されません。 –