브로드캐스트 리시버는 암시적 인텐트로 실행할 수 없다.
<!-- 매니페스트에 리시버 등록 -->
<receiver
...>
<intent-filter>
<action android:name="ACTION_RECEIVER"/>
</intent-filter>
</receiver>
// 암시적 인텐트로 브로드캐스트 리시버 실행
val intent = Intent("ACTION_RECEIVER")
sendBroadcast(intent)
위의 코드로 인텐트를 시스템에 전달하면 리시버는 실행되지 않고 오류가 발생한다.
대신 리시버를 매니페트스에 등록하지 않고 registerReceiver() 함수로 등록하면 암시적 인텐트로도 실행이 된다.
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
...
}
}
registerReceiver(receiver, IntentFilter("ACTION_OUTER_DYNAMIC_RECEIVER"))
...
val intent = Intent("ACTION_OUTER_DYNAMIC_RECEIVER")
sendBroadcast(intent)
서비스는 앱이 백그라운드 상태일 때 인텐트를 전달하면 오류가 발생한다.
앱이 백그라운드 상황에서도 서비스를 실행할 방법이 존재한다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
안드로이드 버전을 고려해서 startForegroundService() 또는 startService() 함수로 인텐트를 실행한다.
백그라운드 상황에서 startForegroundService()로 실행한 서비스는 시간이 지나면 오류가 발생하면서 강제로 종료된다.
따라서 서비스를 startForegroundService()로 실행했다면, startForeground()함수를 호출해 포그라운드 상황으로 만들어야 하고, 그러면 서비스가 종료되지 않게 된다.
// 서비스 쪽 코드
val notification = builder.build()
startForeground(1, notification)
아래와 같이 매니페스트에 퍼미션을 등록해 줘야 한다.
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />