2012-04-23 2 views
4

내 응용 프로그램은 사용자가 화면 잠금을 해제 축배를 만들 필요가있다, 그래서 나는과 같이, 매니페스트에 의도 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를 인스턴스화했으며, 의도. 나는 수업을 오해하고 그 의도를 받아 들여야한다고 생각했다. 그러나 그 블록을 제거한 후에 나는 단지 한 번 의도를 받는다. 안드로이드는 의도를 두 번 보내지 않고 그냥 두 번 집어 들었습니다 ... 여러분 모두 도와 주셔서 감사합니다!

+0

당신이 방송을 보내는 방법에 관한 코드를 붙이십시오. – Longerian

+0

나는 그것을 onReceive 메소드에 넣었습니다. 'context.startService (i) '를 사용하면 –

+0

은 서비스를 시작하지 않고 브로드 캐스트를 전송하는 코드를 의미합니다. – Longerian

답변

0

이 시도 :

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. 보내기 이제 내가 정확히 잘 모릅니다 당신은 당신의 XML-매니페스트 파일에서 선언 한 모든 물건을 제거 할 수 있습니다

Intent intent = new Intent(Intent.ACTION_USER_PRESENT); 
SendBroadcast(intent); 

을 방송하지만 난 그것을 작동한다고 생각합니다.

+5

Intent.ACTION_USER_PRESENT는 시스템에 의해서만 전송 * 될 수 있습니다. –

관련 문제