개발한 앱 중에 잘동작되던 BroadcastReceiver가 다른사람이 소스를 수정 후 1회만 작동하고 동작이 되지 않는 현상이 나타났다.

사용한 형태는 Service에서 registerReceiver()와 unregisterReceiver()를 사용한 동적 리시버 형태이다.

 

원인을 파악한 결과 다음과 같았다.

 

다른 소스에서 해당 서비스를 적당한 인자를 넣은 intent를 포함시켜 startService()로 호출하여

onStartCommand()에서 전달된 intent의 구분자에 따라 registerReceiver() 및 unregisterReceiver()를 하도록한 형태로

서비스내에서 지속적으로 리시버가 동작하지 않고, onStartCommand를 통해 1회만 동작하고 정지되어 버렸다.

 

또한 dumpsys를 통해 해당 앱의 서비스에 등록된 리시버를 분석한 결과 등록한 리시버가 적당한 때에 해제되지 않아 메모리 누수로 이어지는 것을 확인하였다.

 

연구결과 동적 리시버는 서비스(Service) 또는 액티비티(Activity)의 생명주기(Lifecycle)를 같이 하도록 사용하는 것이 좋다는 결론이다.

즉, onCreate()에서 해당 리시버의 registerReceiver()를 호출하여 등록을 하고,

onDestroy()에서 unregisterReceiver()를 호출하여 리시버를 등록해제 하는 것이다.

 

다만 서비스가 강제 종료되면 동적 리시버가 동작하지 않게 되므로 적당한 서비스 감시 또는 재시작 루틴이 필요할 것이다.

아니면 정적 리시버 사용을 고려해야 한다.

Posted by dcmru
,