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