2016-10-31 3 views
1

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

Я создал новый класс активности, новый вещательный приемник, зарегистрировал их в манифесте. Далее, я называю:

Intent intent = new Intent(this, AppCloseReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
try 
{ 
    pendingIntent.send(); 
} 
catch(Exception ex){} 

System.exit(0); 

Проблема заключается в том, что новое окно иногда! Сначала я думал, что System.exit(0); срабатывает перед тем, как у новой активности есть шанс начать (из-за асинхронного вызова, мысль не могла найти это в документации), поэтому я добавил Thread.sleep(1000) между pendingIntent.send(); и System.exit(0);, но результат тот же - появляется новое окно . В журналах ничего нет, никаких исключений.

Новое действие - это всего лишь статический текст.

+0

Это абсолютно надежный объект. Вызов 'System.exit()' в основном отключает виртуальную машину. Вы не можете гарантировать, что что-то произойдет, когда вы выключите виртуальную машину. Вы, конечно, не можете ожидать, что что-то будет отображаться в пользовательском интерфейсе. Пожалуйста, объясните свой вариант использования и, возможно, мы можем предложить альтернативу. –

+0

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

ответ

1

Это ненадежное устройство. Если вы вызываете выключение виртуальной машины, вы ничего не можете отобразить, так как больше не работает VM. Единственный надежный способ сделать это - обеспечить, чтобы BroadcastReceiver и Activity выполнялись в другом процессе ОС для отображения вашего сообщения. Это также не на 100% надежнее, потому что в зависимости от характера исключения ваша существующая виртуальная машина может не запускать другие компоненты, но она, вероятно, более надежна, чем ваша текущая реализация. Например, если ваше приложение выходит из строя из-за OutOfMemoryException, возможно, что-то не будет полезно.

Чтобы убедиться, что компонент работает в отдельном процессе, добавьте

android:process=":other" 

определений <activity> и <receiver> в манифесте для этих компонентов.

Вы также должны попытаться отложить вызов System.exit(), чтобы дать виртуальной машине возможность инициировать запуск диалога. Кроме того, для этого вам не нужно использовать PendingIntent. Попробуйте что-то вроде этого:

Intent intent = new Intent(this, AppCloseReceiver.class); 
sendBrodcast(intent); 
// Start separate Thread to terminate the process 
new Thread(new Runnable() { 
    @override 
    public void run() { 
     SystemClock.sleep(1000); // Sleep a bit to give the VM enough time to actually send the broadcast Intent 
     System.exit(0); 
    } 
}).start(); 
Смежные вопросы