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);
    }
}
Другие вопросы по тегам