서비스에서 PHONE_STATE 리시버로 받으려고 테스트하였습니다.
서비스에서 등록한 Receiver로는 PHONE_STATE 이벤트가 도착하지 않는군요.
Manifest.xml 에 receiver를 적어 놓았습니다.
서비스에서 등록한 것과 Manifest.xml에서 적어 놓은 Receiver class는 같은 class name (CallReceiver)입니다.
실제로 동작시켜보니 CallReceiver의 instance를 빈 라파미터 생성자로 다시 생성하여 동작하네요.
서비스에서 등록해 놓은 instance에게는 이벤트가 전달되지 않고 있습니다.
서비스에서 등록할 때 사용한 intent action과 xml에서 적어놓은 action은 동일한 string입니다.
<receiver android:name="com.androidservice.call.CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
public class CallReceiver extends BroadcastReceiver
{
public CallReceiver()
{ // PHONE_STATE 이벤트가 발생할 때, 원치않게 새로운 instance를 만드는 곳. 원치 않는 인스턴스임
}
public CallReceiver(SmartLifeService service)
{ // 서비스에서 등록한 CallReceiver . 이 인스턴스로 이벤트가 들어오길 바람.
}
테스트를 해 보지 않았지만. Broadcastreceiver 를 mainfest 랑 code랑 두군데에서 설정을 해 놓으신거죠..?
그렇다면, manifest 에서 receiver 를 설정하신 걸 지워보시고 한번 해 보는건 어떨까요..
Replicant 님 / 감사합니다. 잘 되네요.
결론은, 코드 상에서 등록한 리시버는 Manifest.xml에서는 써놓지 말라 !
코드 상에서 등록을 하고, xml에서도 이 app에서는 CallReceiver를 사용한다라는 의미로 적어두었는데,
그렇게 하면 안되네요.
Manifest.xml에 안적어 줘도 된다가 아니라,
Manifest.xml에는 절대로 적으면 안된다라는 것이 정답이네요.
Manifest.xml에도 receiver를 적으면 문제가 코드 상에서 등록한 receiver instance는 물론이고,
빈생성자로 새로운 instance를 생성한 후 onReceive를 부르는 큰 문제가 생기게 됩니다.
정말 황당한 사실은
PHONE_STATE는 Manifest.xml에 적어 놓으면 빈생성자로 새로 instance를 만들어서 onReceive를 부르는데,
SCREEN_ON, SCREEN_OFF는 그렇지 않다는 것입니다.
실제로 테스트해보기 전에는 알 수 없는 뒤죽박죽인 상태네요.




흠... 전 잘 이해 못하겠는데요... onReceive에서 인텐트 받을 경우의 처리를 하는게 아녔나요?
그리고 CallReceiver(service)에서 super.CallReceiver();는 호출하고 계신지요??