Почему мой 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
Попробуйте следующее:
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, я точно не знаю, но думаю, что он должен работать.