2012-10-13 3 views
3

경보 앱을 만들고 있습니다. 경보가 의도를 시작할 때 수신기는 "마술"이 일어나는 곳에서 시작됩니다. 어떻게 든 브로드 캐스트 수신기 내부의 onReceive() 메서드는 한 번 이상 호출됩니다.수신기가 호출 된 후 의도가 두 번 이상 호출되었습니다.

왜 그런가?

편집 : 화면이 발생하지 않습니다 열려있는 경우는, 화면이 닫혀 한 번 만 더 후라고

. 화면을 닫을 때이 코드를 호출하여 엽니 다.

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
            PowerManager.ACQUIRE_CAUSES_WAKEUP | 
            PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

무엇이 잘못 되었나요?

<receiver android:name="com.xxx.xxx.myAlarmReceiver" > 
    <intent-filter> 
      <action android:name="REFRESH_THIS" /> 
    </intent-filter> 
</receiver> 

나는 REFRESH_THIS 확실하지 않다 다음 AndroidManifest.xml에서이 코드를 사용하여 브로드 캐스트 리시버를 등록했다. 하지만 여전히, 만약 내가 그것을 변경 수신기는 여전히 한 번 더 호출됩니다.

답변

0

최근에 동일한 동작을하는 응용 프로그램을 디버깅하고있었습니다. 장치가 켜져 있고 인 텐트를 처리하는 서비스가 백그라운드로 처리되는 동안 메시지가 누적됩니다.

일부 잠재적 인 문제는 위해 밖으로 보일 수 있습니다 :

  • 당신이 간격 타이머와 알람을 사용하는 경우 타이머 ( setRepeating(), 또는 덜 멋진 시리얼 방법을 통해) 갈 수있다 (응용 프로그램/서비스)가 실행 중이 아닌 동안 (예 : 장치가 꺼져있는 동안 - see the doc) 여러 번 꺼야합니다. 그 결과 은 여러 메시지가 처리기에 대기 중임을 나타내며 응용 프로그램이 포 그라운드로 되돌려지면 처리기는 대기열을 통해 을 실행합니다. 여러 개의 알람 인 텐트가 사용됩니다.

  • 당신은 당신이 START_REDELIVER_INTENT과 함께 서비스를 시작 의도를받을 Service를 확장하는 클래스를 사용하고 있습니다. 서비스가 백그라운드 중간 작업 인 경우 : 을 부분적으로 성공적으로 실행했으며 일시 중지 된 경우 중단되었습니다. 다시 시작할 때 인 텐트가 다시 배달되고 두 번째로 처리됩니다.

  • recycle() 메시지를 보내거나 대신 IntentService을 확장하십시오.

    • 한 의도가 여러 번 전달되는 경우, 또는 몇 가지 의도가 볼 (addExtra(String, int) 통해) 각각의 목적에 증가 여분을 추가

    수행 할 수 있습니다 디버깅하려면 동시에 소모됩니다.

질문에 수신기 코드도 포함시켜야합니다.

그게 전부입니다.

관련 문제