4

私のアプリケーションは、ユーザーが画面のロックを解除したときにトーストを作成する必要があるため、次のようにマニフェストで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;
        }
    }
}

しかし、何らかの理由で Log ステートメントが 2 回出力され、私のサービスは 1 回ではなく 2 回のトーストを作成します。なぜこれが起こっているのか、そしてそれを止めるために私に何ができるのか誰か知っていますか? 私はばかげたことを見落としていますか?

編集: 大変申し訳ありませんが、私は自分で問題を見つけました...バグは、ブロードキャストを受信するはずだったサービスクラスで、新しい ScreenReceiver をインスタンス化し、それもインテントを取得していたことです。クラスを誤解していて、インテントを受け取るにはそこにクラスが必要だと思っていましたが、そのブロックを削除した後、インテントを一度だけ受け取りました。Android がインテントを 2 回送信したのではなく、2 回受信しただけでした。ご協力ありがとうございました。

4

1 に答える 1

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ファイルで宣言したものをすべて削除できます。正確にはわかりませんが、機能するはずです。

于 2012-04-23T19:25:32.727 に答える