티스토리 뷰

반응형

데이터를 관리하고 다른 애플리케이션 데이터를 제공해주는 컴포넌트입니다.

사용자의 요청이나 시스템에서 사건이 발생할 경우 개발자가 만든 코드를 동작시킬 수 있습니다.

브로드 캐스트 리시버는 Ui를 가지고 있지 않습니다.

 

브로드 캐스트 리시버 만들기

 

 

New > Other > Broadcast Receiver을 누르고 생성을 합니다.

 

 

 

간단하게 브로드 캐스트 리시버 생성하고 실행하기

브로드 캐스트 리시버를 실행하면 Toast 메시지를 띄어주는 예제입니다.

 

 

생성한 브로드 캐스트 리시버의 코드를 아래와 같이 작성을 해줍니다.

 

class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {

        Toast.makeText(context, "동작 중", Toast.LENGTH_SHORT).show()
    }
}

브로드 캐스트 리시버가 생성되면 onReceive 함수가 자동으로 실행이 됩니다.

onReceive 함수 안에 Toast를 띄어주는 코드를 작성하였습니다.

 

 

 

MainActivity의 코드입니다.

 

 

button.setOnClickListener {

    val intent = Intent(this, MyReceiver::class.java)

    sendBroadcast(intent)
}

button을 클릭하면 브로드 캐스트 리시버가 실행되도록 하는 코드를 작성하였습니다.

 

 

실행하면 아래와 같이 동작합니다.

 

 

 

 

보통 브로드 캐스트 리시버를 os에 의해서 자동으로 실행이 되도록 하거나 다른 앱에서 실행이 되도록 합니다.

따라서 위와 같이 같은 앱에서 브로드 캐스트 리시버를 사용하는 것은 의미가 없습니다.

 

 

다른 앱에서 다른 앱 브로드 캐스터 리시버 사용하기 ( 명시적 Intent 사용 ) 

명시적 인텐트란

  • 동작시키고자 하는 구성 요소의 클래스명을 직접 입력해서 동작시켜야 합니다.
  • 한 번에 하나만 실행이 가능합니다.

 

 

아래와 같이 사용을 하면 됩니다.

val intent = Intent()
intent.setClassName("com.example.broadcastreceiverexample", "com.example.broadcastreceiverexample.MyReceiver")
sendBroadcast(intent)

 

setClassName으로 사용을 하면 되는데, 처음 들어가는 값은 

 

 

사용하려는 브로드 캐스터 리시버가 있는 앱의 package를 넣어주면 됩니다.

 

그리고 두 번째 값은 브로드 캐스터 리시버의 class의 package 값을 넣어주면 됩니다.

 

 

브로드 캐스터 리시버를 사용하여 데이터 전달하기

intent를 사용하기 때문에 데이터 전달도 가능합니다.

 

 

브로드 캐스터 리시버의 코드를 아래와 같이 수정하였습니다.

class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {

        val data = intent.getIntExtra("data", 0)

        Toast.makeText(context, "동작 중 $data", Toast.LENGTH_SHORT).show()
    }
}

 

브로드 캐스트 리시버를 사용하고자 하는 쪽에서 아래와 같이 코드를 작성하면 데이터를 전달받을 수 있습니다.

val intent = Intent()
intent.setClassName("com.example.broadcastreceiverexample", "com.example.broadcastreceiverexample.MyReceiver")
intent.putExtra("data", 7)
sendBroadcast(intent)

 

 

다른 앱에서 다른 앱 브로드 캐스터 리시버 사용하기 ( 암시적 Intent 사용 ) 

이제 암시적 인텐트를 통해서 브로드 캐스터 리시버를 사용하도록 하겠습니다.

암시적 인텐트는 안드로이드 오레오부터 사용이 안된다는 점을 참고해주시길 바랍니다. [ 하지만 앱이 실행 중이면 사용이 가능합니다. ]

 

 

암시적 인텐트란

  • Intent Filter를 통해 설정한 이름을 이용하는 것입니다.
  • 동일한 이름이 여러 개 있을 경우에는 선택을 하고, 아니면 자동으로 실행이 됩니다.

 

AndroidManifest.xml에서 아래와 같이 receiver에 intent filter를 등록해줍니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcastreceiverexample">

    <application
        ... >
        
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            
            <intent-filter>
                <action android:name="com.example.myreceiver"/>
            </intent-filter>
            
            </receiver>
            
            ...
            
    </application>

</manifest>

 

암시적 인텐트를 사용하게 되면 코드를 통해 리시버를 등록해주고 제거해줘야 됩니다.

아래와 같이 코드를 작성해 줍니다.

class MainActivity : AppCompatActivity() {

    private var myReceiver: MyReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        addReceiver()

        ...
    }

    private fun addReceiver() {

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            myReceiver = MyReceiver()

            val filter = IntentFilter("com.example.myreceiver")
            registerReceiver(myReceiver, filter)
        }
    }

    override fun onDestroy() {
        super.onDestroy()

        if (myReceiver != null) {
            unregisterReceiver(myReceiver)
            myReceiver = null
        }
    }
}

onDestory를 통해 리시버를 제거해줬기 때문에 만약 리시버를 사용하고자 한다면 리시버를 가지고 있는 앱도 실행을 해줘야 합니다.

 

 

 

그리고 브로드 캐스터 리시버를 사용하고 싶은 앱에서 아래와 같이 코드를 작성해주면 됩니다.

val intent = Intent("com.example.myreceiver")
intent.putExtra("data", 7)
sendBroadcast(intent)

 

 

 

 

안드로이드 오레오부터는 명시적 인텐트를 사용하시길 바랍니다.

반응형
댓글