Почему мой BroadcastReceiver получает ACTION_USER_PRESENT дважды?

Мое приложение должно сделать тост, когда пользователь разблокирует экран, поэтому я зарегистрировал BroadcastReceiver чтобы забрать намерение ACTION_USER_PRESENT в манифесте, например:

 <receiver android:name=".ScreenReceiver" > <intent-filter> <action android:name="android.intent.action.USER_PRESENT"/> </intent-filter> </receiver> 

И тогда я определил класс следующим образом:

 package com.patmahoneyjr.toastr; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class ScreenReceiver extends BroadcastReceiver { private boolean screenOn; private static final String TAG = "Screen Receiver"; @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { screenOn = true; Intent i = new Intent(context, toastrService.class); i.putExtra("screen_state", screenOn); context.startService(i); Log.d(TAG, " The screen turned on!"); } else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { screenOn = false; } } } 

Но по какой-то причине оператор журнала печатается дважды, а мой сервис делает два тоста вместо одного. Кто-нибудь знает, почему это может произойти, и что я могу сделать, чтобы остановить его? Я не замечаю что-то глупое?

EDIT: Мне очень жаль всех, но я сам нашел проблему … ошибка заключалась в том, что в классе обслуживания, который должен был получить трансляцию, я создал экземпляр нового ScreenReceiver, и он тоже собирал намерение. Я неправильно понял класс и подумал, что для получения намерения я должен был иметь его там, но после удаления этого блока я получаю только одно намерение. Android не отправлял намерение дважды, он просто собирался дважды … Спасибо за вашу помощь всем!

Попробуй это:

1. Просто создайте приемник вещания.

 BroadcastReceiver reciever_ob = new BroadcastReceiver( @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(Intent.ACTION_USER_PRESENT)){ //DO YOUR WORK HERE } } } 

2. Зарегистрируйте ваш ресивер перед отправкой трансляции с помощью вышеперечисленного объекта вещания. Вы также можете добавить несколько действий.

 IntentFilter actions = new IntentFilter(Intent.ACTION_USER_PRESENT); registerReciever(reciever_ob, actions); 

3. Отправить трансляцию

 Intent intent = new Intent(Intent.ACTION_USER_PRESENT); SendBroadcast(intent); 

Теперь вы можете удалить все свои материалы, которые вы указали в файле xml-manifest, который я точно не знаю, но я думаю, что он должен работать.

Intereting Posts
Поля, не работающие Как согласовать разницу в соотношении сторон между размером предварительного просмотра камеры и размером изображения Android Sqlite – ошибка «Нет такой таблицы» Открыть диалоговое окно «Файл» в Android? Поддержка разрешения и плотности планшета Android План Android с видом справа, который занимает заданное пространство и просматривает левые шкалы, чтобы заполнить остальную часть экрана до определенного предела Не удается получить офлайн-сообщения, используя asmack api для приложения Gtalk Создать новое менюInflater или getMenuInflater () из активности? Сохранить аппаратное ускорение андроида холст как растровое изображение Android Google Drive SDK – как показать список файлов в выбранной папке Android Image Picker Выберите несколько изображений из галереи с максимальным лимитом 5 Как вы можете вставить вложенную HashMap в ArrayList Я часто получаю SQLiteDoneException при запросе одного значения, почему? Google Cloud Endpoint продолжает бросать исключение «неожиданного конца потока» Как настроить намерение совместного использования в Android?