Мое приложение должно сделать тост, когда пользователь разблокирует экран, поэтому я зарегистрировал 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 не отправлял намерение дважды, он просто собирался дважды... Спасибо за вашу помощь всем!