2012-02-28 2 views
49

Мне просто интересно, можно ли зарегистрировать широковещательный приемник, который обнаруживает включение/выключение экрана в манифесте приложения. Причина, по которой мне не нравится программируемый метод, заключается в том, что приложение должно работать, чтобы обнаружить такую ​​вещь, а: «Приложения с широковещательными приемниками, зарегистрированными в манифесте, не должны запускаться, когда Намерение транслируется для приемников Execute»(источник: Professional Android 2 Application книги Development)android: широковещательный приемник для отображения экрана и экрана выключен

Мое приложение на самом деле является Lockscreen приложение, которое с помощью программирования способ должен работать все время: S

Is там вокруг?

Пытаюсь следующее в манифесте:

<receiver android:name=".MyBroadCastReciever"> 
    <intent-filter> 
     <action android:name="android.intent.action.SCREEN_OFF"/> 
     <action android:name="android.intent.action.SCREEN_ON"/> 
    </intent-filter> 
</receiver> 

и простой класс MyBroadCastReciever:

public class MyBroadCastReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
      Log.i("Check","Screen went OFF"); 
      Toast.makeText(context, "screen OFF",Toast.LENGTH_LONG).show(); 
     } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { 
      Log.i("Check","Screen went ON"); 
      Toast.makeText(context, "screen ON",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

Можете ли вы дать мне образец, который работает? Я хочу что-то сделать, когда блокировка экрана или разблокировка. –

ответ

66

два действия для экрана включения и выключения являются:

android.intent.action.SCREEN_OFF 
android.intent.action.SCREEN_ON 

Но если вы зарегистрируете приемник для этих трансляций в манифесте, то получатель не получит эту трансляцию s.

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

PS: запустите сервис на переднем плане, чтобы он работал дольше.

Простой фрагмент кода будет выглядеть примерно так:

IntentFilter screenStateFilter = new IntentFilter(); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON); 
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); 
registerReceiver(mScreenStateReceiver, screenStateFilter); 

Не забудьте отменить приемник в Service «s OnDestroy:

unregisterReceiver(mScreenStateReceiver); 

Только в случае для людей, которые спрашивают, почему получатель не работает с объявлением трансляций в манифесте для ACTION_SCREEN_ON и ACTION_SCREEN_OFF:

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ONhttps://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_OFF

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

Это защищенный объект, который может быть отправлен системой.

+4

ОК, так что вокруг не обойтись? это так, как делаются блокировки приложений? – himura

+4

отличный ответ, но почему приемник не работает для этих трансляций в манифесте? –

+1

Если вы прослушаете ACTION_SCREEN_OFF в манифесте, ОС должна будет запустить новый процесс для вашего приложения, если он не был запущен при запуске трансляции. Разработчики Android хотели предотвратить это, так как часто подразумевает, что устройство вот-вот вступит в состояние низкой мощности. –

0

Вам необходимо создать фоновое обслуживание, чтобы проверить его. Затем вы можете установить его программно.

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