Android возвращается к предыдущему действию, если происходит сбой другого действия - PullRequest
3 голосов
/ 03 октября 2011

Есть ли способ попросить Android вернуться к предыдущему Activity в моем приложении в случае, если другое Activity вызовет создание необработанного исключения?

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

Вы можете попытаться использовать 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.

0 голосов
/ 03 октября 2011

Используйте блок try-catch для перехвата исключения и startActivity там.Вы не можете перейти к другому занятию, не поймав его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...