내 응용 프로그램은 사용자가 화면 잠금을 해제 축배를 만들 필요가있다, 그래서 나는과 같이, 매니페스트에 의도 ACTION_USER_PRESENT
을 데리러 BroadcastReceiver
등록 :내 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 문이 두 번 인쇄되고 서비스에서 토스트가 두 개가됩니다. 왜 이런 일이 일어나고 있는지, 그리고 내가 그 일을 막기 위해 무엇을 할 수 있는지 아는 사람이 있습니까? 나는 어리석은 것을 간과하고 있는가?
EDIT : 모두들 정말 유감이지만, 문제는 나 자신을 발견했습니다 ... 그 버그는 방송을 받기로되어있는 서비스 클래스에서 새로운 ScreenReceiver를 인스턴스화했으며, 의도. 나는 수업을 오해하고 그 의도를 받아 들여야한다고 생각했다. 그러나 그 블록을 제거한 후에 나는 단지 한 번 의도를 받는다. 안드로이드는 의도를 두 번 보내지 않고 그냥 두 번 집어 들었습니다 ... 여러분 모두 도와 주셔서 감사합니다!
당신이 방송을 보내는 방법에 관한 코드를 붙이십시오. – Longerian
나는 그것을 onReceive 메소드에 넣었습니다. 'context.startService (i) '를 사용하면 –
은 서비스를 시작하지 않고 브로드 캐스트를 전송하는 코드를 의미합니다. – Longerian