반응형
브로드캐스트 인텐트는 주요 시스템 이벤트에 관심 있는 애플리케이션들에게 통지하기 위해 안드로이드 시스템에 의해서 사용된다.(헤드폰 연결이 되거나, 끊어지는 등 주요 시스템 이벤트)
FLAG_INCLUDE_STOPPED_PACKAGES : stopped 된 application도 target이 됨.
FLAG_EXCLUDE_STOPPED_PACKAGES : stopped 된 application은 target이 되지 않음.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent()
intent.action = "com.example.android"
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)
intent.putExtra("MyData", 1000)
sendBroadcast(intent)
}
안드로이드 3.0이상 버전에서의 안드로이드에서는 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) 코드를 추가해야한다.
이 flag를 설정하면 Stopped된 애플리케이션에서도 인텐트를 통해 값을 받을 수 있다.
정책에 따르면 애플리케이션이 방금 설치되어서 이전에 런칭된 적이 없거나, 장치의 애플리케이션 매니저를 사용해서 사용자가 수동으로 정지시켰을 경우 그 애플리케이션은 사용 정지된 상태에 있다고 간주된다.
그래서 위 플래그를 사용해서 모든 앱에서 인텐트를 수신할 수 있도록 설정한다.
class SampleBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
when (intent?.action) {
BluetoothAdapter.ACTION_STATE_CHANGED -> {
val state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)
if (state == BluetoothAdapter.STATE_ON) {
localDeviceServiceReInit(context!!)
}
}
}
}
private fun localDeviceServiceReInit(context: Context) {
val i = Intent(context, LocalDeviceService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(i)
} else {
context.startService(i)
}
}
companion object {
private val LOG_TAG = BluetoothBroadcastReceiver::class.java.simpleName
}
}
onReceive() 메소드에서는 5초이내에 필요한 일을 수해하고 복귀하도록 제한한다.
따라서, 브로드캐스트 수신자에서는 시간이 오래 걸리는 작업을 수행하면 안된다.
<receiver android:name=".algo_iot.local.BluetoothBroadcastReceiver">
<intent-filter>
<action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
</intent-filter>
</receiver>
브로드캐스트리시버 정적 등록
registerReceiver(receiver, IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)) // 블루투스가 연결되거나 해제되었을 때 위에 작성한 receiver를 등록한다.
unregisterReceiver(receiver) // 해제
중요
안드로이드 시스템의 일부 브로드캐스트 인텐트는 매니페스트 파일이 아닌 코드에서 등록된 브로드캐스트 수신자에서만 받을 수 있다.
반응형