как реализовать uncaughtException для Android - PullRequest
30 голосов
/ 20 января 2012

Я нашел это Android: как автоматически перезапустить приложение после его принудительного закрытия?

но я не знаю куда и как поставить диспетчер аварийных сигналов

спасибо

Ответы [ 2 ]

67 голосов
/ 20 января 2012

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

public class MyApplication extends Application {
    // uncaught exception handler variable
    private UncaughtExceptionHandler defaultUEH;

    // handler listener
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler =
        new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {

                // here I do logging of exception to a db
                PendingIntent myActivity = PendingIntent.getActivity(getContext(),
                    192837, new Intent(getContext(), MyActivity.class),
                    PendingIntent.FLAG_ONE_SHOT);

                AlarmManager alarmManager;
                alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                    15000, myActivity );
                System.exit(2);

                // re-throw critical exception further to the os (important)
                defaultUEH.uncaughtException(thread, ex);
            }
        };

    public MyApplication() {
        defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

        // setup handler for uncaught exception 
        Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
    }
}
2 голосов
/ 20 января 2012

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

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

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

Редактировать:

См. здесь , ответ Гюри.Кроме того, вам нужно всего лишь реализовать интерфейс , а именно UncaughtExceptionHandler, и вставить в него код Гюри.

Редактировать # 2:

Для справки: Запущенная служба "липкая" может также достичь желаемого результата.

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