2012-03-15 3 views
0

원래 코드를 통해 내 주요 활동에 브로드 캐스트 리시버를 등록했습니다. 그러나 IntentServices (백그라운드에서 실행되는)는 인 텐트를 브로드 캐스트하므로 항상 사용할 수있는 브로드 캐스트 수신기가 필요합니다. 내 코드에서 수신기를 등록하는 나의 방법은 뒤로 버튼을 누를 때까지 계속 작동했습니다. 그런 다음 주 활동이 파손됨에 따라 수신기가 등록 취소됩니다.이상한 브로드 캐스트 수신기 동작

이와 같이 수신기의 선언을 Manifest 파일로 옮길 생각이 들었습니다. 그러나, 나는 코드가 의도를 방송 할 때마다 브로드 캐스트 리시버의 새로운 인스턴스가 만들어지는 이상한 문제를 보게된다. 내가 원했던 것은 방송 수신기의 단일 인스턴스를 항상 사용할 수 있도록하는 것입니다. 이는 내 브로드 캐스트 리시버가 타이머를 생성하고 시작하기 때문에 발생하지만, 리시버의 인스턴스가 여러 개 만들어지면 여러 타이머가 만들어져 좋지 않습니다.

참고 : 내 브로드 캐스트 수신기의 단일 인스턴스는 인 텐트를 수신하지만 타이머가 이미 시작된 경우를 처리 할 수 ​​있습니다.

<receiver android:name=".StartTimerBroadcastReceiver" android:enabled="true" > 
     <intent-filter> 
      <action android:name="START_TIMER" /> 
     </intent-filter> 
</receiver> 

그리고 여기 의도를 방송 내 코드는 다음과 같습니다 :

Intent broadcastIntent = new Intent("START_TIMER"); 
broadcastIntent.putExtra("timerID", "timer1"); 
sendBroadcast(broadcastIntent); 

내가 뭔가 잘못하고 있는가 여기

는 매니페스트 파일에 내 코드? 어떤 도움을 주셔서 감사합니다. 감사합니다

답변

1

Manifest를 통해 BroadcastReceiver 인스턴스를 하나만 가질 수 없습니다.

당신이 할 수있는 일은 타이머를위한 정적 변수를 만드는 것입니다.

문제의 해결책이 아니라면 서비스를 만들고 브로드 캐스트가 수신되면 Intent에서 일부 EXTRA를 사용하여 시간을 시작하는 방법 (즉, 브로드 캐스트를 서비스로 리디렉션)을 지정하여 서비스를 시작하십시오.

+0

감사합니다. 이 두 가지 옵션을 살펴 보겠습니다. 가능한 한 쉽게 전체 응용 프로그램에서 단일 타이머를 사용할 수 있기를 원하기 때문에 일부 상황에서 타이머 처리기 클래스를 사용할 수 있습니다. 처음부터 인 텐트 브로드 캐스트를 사용하는 이유는 타이머 개체를 코드에 깊게 전달할 필요가 없었기 때문입니다. 그러나, 나는 다른 개체가 정적 메서드를 통해 타이머를 시작할 수 있도록 제대로 구현 된 타이머 처리기가 괜찮을 것이라고 생각합니다 :) – jtnire

1

이것은 BroadcastReceivers가 작동하는 방식입니다.

"BroadcastReceiver 객체는 onReceive (Context, Intent) 호출 기간 동안 만 유효합니다.이 함수에서 코드가 반환되면 시스템에서 객체를 고려합니다. 완료되고 더 이상 활성화되지 않음

이것은 onReceive (Context, Intent) 구현에서 할 수있는 일에 중요한 영향을 미칩니다. 비동기 작업이 필요한 것은 사용할 수 없습니다. 함수에서 비동기 작업을 처리하지만 그 시점에서 BroadcastReceiver는 더 이상 활성 상태가 아니므로 비동기 작업이 완료되기 전에 시스템에서 프로세스를 종료 할 수 있습니다. "

내가 본 것으로부터, 이것은 매니 페스트에 BroadcastReceiver를 등록 할 때 더 나쁜 것처럼 보입니다.

관련 문제