Android останавливает трансляцию
В моем приложении есть Broadcast Receiver, который ожидает включения / выключения экрана. Что я хочу сделать, это:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
pause some seconds...
...do something
}
}
Как я могу остановить текущий поток в методе onReceive?
3 ответа
Вы не можете и не должны останавливать BrodcastReceiver и postDelayed для Handler();
Вы не должны останавливать это, потому что этот поток должен делать другие вещи, так что не блокируйте это, потому что это плохой дизайн.
и вы не можете postDelay, потому что из документов:
После того, как вы вернетесь из onReceive(), BroadcastReceiver больше не будет активен, и процесс его размещения будет иметь такое же важное значение, как и любые другие компоненты приложения, которые в нем работают. Это особенно важно, потому что если этот процесс размещал только BroadcastReceiver (частый случай для приложений, с которыми пользователь никогда не взаимодействовал или недавно не взаимодействовал), то по возвращении из onReceive () система будет считать свой процесс пустым и агрессивно уничтожать это так, что ресурсы доступны для других более важных процессов.
это означает, что в тот момент, когда он возвращается из onReceive(), все это, вероятно, будет уничтожено очень быстро.
Если вы хотите, чтобы что-то произошло через какое-то время после трансляции, вы можете запустить службу, и эта служба подождет некоторое время, или если время ожидания больше, чем несколько секунд, вам нужно просто запустить запуск. этот сервис в AlarmManager и позволяет AlarmManager запустить сервис для вас.
Согласно нашему короткому разъяснению, я предлагаю, чем в onReceive()
вы используете AlarmManager с set(RTC, System.currentTimeMillis()+10000, thePendingIntentToNotifyYou)
, Таким образом, вы получите уведомление через десять секунд, если устройство не перейдет в спящий режим. (Использование RTC_WAKEUP
иначе.)
Через ваши приемники вещания вы также будете проинформированы о том, что экран выключен и включен (вам нужно будет послушать это, чтобы остановить таймер, если вы этого еще не сделали), и вам придется поддерживать небольшой конечный автомат, чтобы узнать, выполняется ли условие, которое вы ищете (экран выключен на десять секунд) при срабатывании thePendingIntentToNotifyYou
,
Использование Handler.postDelayed
метод.
Так что ваш код будет примерно таким
Handler h = new Handler();
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
h.postDelayed(new Runnable(){
public void run(){
// do something
}
},pause_time_in_milis);
}
}