Client/안드로이드

Broadcast Receiver ?

이건욱 2020. 3. 26. 00:39

android는 게시-구독 디자인 패턴과 유사한 브로드캐스트 메시지를 받거나 보낼수 있습니다.

ex) 통화 이벤트 , 시스템 부팅 , 기기 충전 , 비행기 모드 전환 , 비행기 모드 해제 등등

 

 

info)

  • 명시적 브로드캐스트 (Explicit broadcast)
    • 명시적으로 컴포넌트를 지정해준 경우 
  • 암시적 브로드캐스트 (Implicit broadcast)
    • 호출에 대상이 명확하지 않은 경우
  • API 26이상일 경우 manifest를 사용하여 암시적 브로드캐스트를 수신자를 선언할수 없습니다. (예외)

 

 

mainifest :)

<receiver android:name=".MyBroadcastReceiver"  android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
        </intent-filter>
</receiver>
private const val TAG = "MyBroadcastReceiver"

    class MyBroadcastReceiver : BroadcastReceiver() {

        override fun onReceive(context: Context, intent: Intent) {
            StringBuilder().apply {
                append("Action: ${intent.action}\n")
                append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
                toString().also { log ->
                    Log.d(TAG, log)
                    Toast.makeText(context, log, Toast.LENGTH_LONG).show()
                }
            }
        }
    }
    

 

Context :)

val br: BroadcastReceiver = MyBroadcastReceiver()

val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply {
        addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
    }
registerReceiver(br, filter)

 

보내는 방법 :)

// global 전송
sendBroadcast(Intent("com.example.NOTIFY"))

// global 전송 , 권한을 통해 특정 권한을 보유한 앱세트로 브로드 캐스트제한 
sendBroadcast(Intent("com.example.NOTIFY"), Manifest.permission.SEND_SMS)

 

해당 앱에서만 전송이 가능한 방법 :)

// local broad cast 등록 (해당 앱의 정보를 밖으로 유출하지 않습니다.)
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver,
        IntentFilter("com.example.NOTIFY"));

// local broad cast 전송
LocalBroadcastManager.getInstance(context).sendBroadcast(Intent("com.example.NOTIFY"));