Вы можете попытаться использовать Thread.setDefaultUncaughtExceptionHandler
для получения уведомления, когда какой-либо поток умер из-за необработанного исключения.Но я не уверен в реализации этого механизма в Dalvik.Возможно, вы не сможете запустить другое действие с UncaughtExceptionHandler
, поскольку в документации ничего не сказано о воскрешении потока / процесса.
Обновление
ОК.Я проверил это, и теперь я уверен, что вы НЕ сможете вернуться к предыдущему действию, используя описанную выше технику, если ваше приложение выдало исключение в потоке пользовательского интерфейса.Это происходит потому, что это исключение приведет к закрытию приложения main looper и, следовательно, ваше приложение не сможет обрабатывать дальнейшие сообщения пользовательского интерфейса.
Единственный возможный способ добиться того, чего вы хотите, - это грязный хак:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
while (true) {
try {
Log.i("MyLooper", "Starting my looper");
Looper.loop();
} catch (Exception e) {
Log.e("MyLooper", "Caught the exception in UI thread, e:", e);
showPreviousActivity();
}
}
}
private void showPreviousActivity() {
// your implementation of showing the previous activity
}
}
И зарегистрируйте MyApplication в вашем AndroidManifest.xml:
<application android:name=".MyApplication">
…
Реализация метода showPreviousActivity()
зависит от вас.Одним из возможных решений будет отслеживание текущего экземпляра Activity в каком-либо классе ActivityTracker и вызов метода текущей активности finish()
из кода showPreviousActivity
.