2012-01-20 3 views
28

Я нашел Android: How to auto-restart application after it's been "force closed"?как реализовать uncaughtException андроид

, но я не знаю, где и как поставить менеджера сигнализации

благодаря

+0

Что вы имеете в виду, вы не знаете, где поставить диспетчер аварийных сигналов? –

+0

Мне нужно перезагрузить приложение, когда оно принудительно закрыто либо по ошибке, либо, например, путем завершения процесса с помощью диспетчера задач, ссылка, которую я нашел, выглядела очень хорошо, но я не знаю, как реализовать ошибку обхода ошибки, когда вам нужно поместите диспетчер аварийных сигналов –

+0

Почему вы не используете учетную запись Try and Catch, где произошла ошибка –

ответ

66

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

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); 
    } 
} 
+0

Я положил диспетчер аварийных сообщений в @override, но мое приложение не перезагрузилось, когда я закончил процесс через диспетчер задач:/ –

+1

Я сомневаюсь, что когда процесс * убит *, будет выбрано исключение - или любой другой исполняемый Java-код, если на то пошло. – JimmyB

+1

Я делясь на 0, чтобы вызвать исключение. Поймайте его в моем обработчике, после чего я могу перезапустить приложение. Если вы убьете процесс, я соглашаюсь с @HannoBinder, исключение не будет выбрано, иначе, когда у телефона заканчивается память, и ОС начинает убивать процессы, мы получим множество исключений. – Maxim

1

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

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

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

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

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

Edit # 2:

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

+0

Да, я знаю, что мне нужно его реализовать, но я не знаю Не знаете, как ... вы могли бы разместить образец кода, пожалуйста? –

+0

Минута интернет-поиска могла бы указать вам, например, [это] (http://www.java2s.com/Code/JavaAPI/java.lang/implementsUncaughtExceptionHandler.htm). – JimmyB

+0

Вы не можете использовать getSystemService в статическом классе => alarmanager –

Смежные вопросы