私のアプリケーションは、ユーザーが画面のロックを解除したときにトーストを作成する必要があるため、次のようにマニフェストで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 回受信しただけでした。ご協力ありがとうございました。