Приемник широковещания для ACTION_USER_PRESENT, ACTION_SCREEN_ON, ACTION_BOOT_COMPLETED - PullRequest
6 голосов
/ 01 октября 2011

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

Мой Manifest.xml: -

<receiver android:name=".MyReciever">
    <intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
        </intent-filter>
    </intent-filter>
</receiver>

и мой класс приемника вещания: -

public class MyReiever extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
   Log.d("My Reciever","is intent null => " + (intent == null));
   Log.d("My Reciever",intent.getAction()+"");
   }
}

Хотя другие приложения и службы получают трансляцию для "Screen_on" и "USer_Present", например WifiService.

Ответы [ 5 ]

5 голосов
/ 02 июля 2012

Хотя константами Java являются android.content.intent.ACTION_USER_PRESENT, android.content.intent.ACTION_BOOT_COMPLETED и android.content.intent.ACTION_SCREEN_ON, значения этих констант равны android.intent.action.USER_PRESENT, android.intent.action.BOOT_COMPLETED и android.intent.action.SCREEN_ON.Именно эти значения должны появиться в вашем манифесте.

Обратите внимание, однако, что получатель для ACTION_SCREEN_ON не может быть объявлен в манифесте, но должен быть зарегистрирован кодом Java, см., Например, этот вопрос .

2 голосов
/ 23 января 2019

Поскольку неявные широковещательные приемники не работают с Android 8.0, необходимо зарегистрировать свой приемник по коду, а также в манифесте.

Выполните следующие действия:

  • Добавьте тег манифеста
<receiver android:name=".MyReciever">
    <intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
        </intent-filter>
    </intent-filter>
</receiver>
  • Создайте класс получателя и добавьте ваши коды
public class MyReciever extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
   Log.d("My Reciever","is intent null => " + (intent == null));
   Log.d("My Reciever",intent.getAction()+"");
   }
}
  • Создайте службу и зарегистрируйте в ней получателя
public class MyService extends Service {
MyReceiver receiver = new MyReceiver();

    @Override
    public IBinder onBind(Intent intent) { return null; }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        registerReceiver(receiver);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}
  • Не забудьте указать службу в манифесте
<service android:name=".MyService"/>

Чтобы ваша трансляция работала, вы должны зарегистрировать ее в службе,А чтобы поддерживать работу службы, вы можете использовать такие инструменты, как alarm managers, jobs и т. Д., Которые не связаны с этим вопросом.

1 голос
/ 23 января 2019

Я могу дать вам только быстрый совет, поскольку я прошел тот путь, по которому вы идете с гораздо меньшим успехом. Попробуйте прочитать logcat, используя java.util.logging, чтобы вам не требовалось разрешение на чтение журналов. И в представлении журнала создайте прослушиватель для сообщения, содержащего «отключение системы» в качестве заголовка. он срабатывает как при блокировке, так и при разблокировке. проверьте тот, который дает доступ к system.android, а не другой экран. Надеюсь, поможет. Желаем удачи

1 голос
/ 17 января 2019

Кроме Typo, о котором упоминалось в предыдущих ответах, и того факта, что имя пакета класса получателя должно быть полностью упомянуто в теге receiver, я думаю, проблема в том, что в рассматриваемом коде используются два вложенных фильтра намерений. Я считаю, что этот код будет работать правильно:

 <receiver android:name=".MyReciever">
    <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
    </intent-filter>
</receiver>
1 голос
/ 28 января 2013

Проверьте имя вашего класса, которое расширяет BroadcastReceiver. Должно быть "MyReciever", а не "MyReiever"

...