uncaught исключения перезапуска вызывающей деятельности? - PullRequest
1 голос
/ 17 декабря 2010

У меня большое приложение для Android, и в последнее время я вижу, что для любого неперехваченного исключения это исключение отображается в DDMS Logcat, и после этого вызывается родительское действие, которое перезапускается (вызывается метод onCreate get).В идеале приложение должно просто завершиться.

Мы используем отчеты о сбоях приложения ARCA, но прокомментировали это и все еще видим, что та же активность возобновляется.Я называю startActivityForResults, и манифест андроида имеет android: finishOnTaskLaunch true для действия, а также для subactivity.

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

1 Ответ

2 голосов
/ 17 декабря 2010

Я считаю, что это ожидаемое поведение закрытия сил. Пользователь получает уведомление об исключении, когда они подтверждают его, система пытается вернуть их как можно ближе к их текущему состоянию, то есть к последнему действию, которое сработало.

Я не уверен, почему такое поведение нежелательно, но вам, вероятно, нужно придумать свой собственный способ распознавания, что действие было перезапущено из-за сбоя, и немедленно выйти из onCreate.

Edit: Я просто собрал тестовое приложение:

public class Activity1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button)findViewById(R.id.button);
        button.setText("test");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Activity1.this, Activity2.class);
                startActivityForResult(intent, 0);
            }
        });
    }
}

public class Activity2 extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Button button = (Button)findViewById(R.id.button);
        button.setText("test2");
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                throw new RuntimeException();
            }
        });
    }
}

Когда вы нажимаете кнопку в Test2, возникает исключение. Android показывает диалоговое окно принудительного закрытия, и когда вы нажимаете OK в диалоговом окне, вы возвращаетесь в Test. Вот что я имел в виду под поведением по умолчанию.

Лучший способ справиться с этим - исправить приложение так, чтобы оно никогда не выдавало исключение.

В качестве последнего средства вы можете добавить обработчик для обработки необработанных исключений: uncaughtExceptionHandler . Это предотвращает отображение диалогового окна принудительного закрытия, поэтому вы можете делать все, что захотите.

...