Как мне остановить зомбирование моего приложения после обработки необработанного исключения?

Я обрабатываю любые неперехваченные исключения, возникающие в моем приложении, через:

Thread.setDefaultUncaughtExceptionHandler(this);

где это мой лаунчер Activity, реализующий UncaughtExceptionListener. Я обрабатываю исключение и отправляю его на сервер журналов, но мое приложение не заканчивается. Он просто бежит как зомби, пока не нажата кнопка возврата домой или назад. Как я могу убить процесс после обработки исключения?

редактировать
Вот тестовое и рабочее действие, которое генерирует неперехваченное исключение, которое должно быть перехвачено (потоком) и обработано. Тост никогда не публикуется, и процесс регистрируется как исключение.

class TestActivity extends Activity implements UncaughtExceptionListener {

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

        Thread.setDefaultUncaughtExceptionHandler(this);
        throw new RuntimeException("I'm a destuctive booger.");

        setContentView(R.layout.activity_test);
    }

    @Override public void uncaughtException(Thread thread, Throwable toss) {
        Log.e(TAG, "An uncaught exception has been recieved.", toss);
        Toast.makeText(this, "Big Error", Toast.LENGTH_LONG).show();
    }
}

2 ответа

Решение

Я провел некоторое тестирование с вашим примером кода и обнаружил, что finish() будет работать с uncaughtException(), Однако он молчит, поэтому не дает никаких отзывов пользователю, и, как и вы, я не смог вызвать Toast или любое другое визуальное окно сообщения, даже используя getApplicationContext(),

Единственный способ отправить любой отзыв, который мне удалось получить, - это использовать NotificationManager отправить строку состояния Notification с помощью getApplicationContext() для Context,

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

Однако можно было бы создать Activity возможно с темой диалога, которая будет открыта и объяснит сбой.

Не уверен, что есть более мягкий способ решения этой проблемы, но вы можете попробовать:

import android.os.Process;

Process.killProcess(Process.myPid());
Другие вопросы по тегам