KotlinでLocalBloadcastをやってみる

Androidエンジニアにとってブロードキャストは日常的によく使うものだと思いますが、Andorid初心者の私にとってはブロードキャストわからなすぎてハマりました。

LocalBloadcast

通常のBloadcastでは端末全体のアプリにブロードキャストを飛ばしますが、LocalBloadcastはアプリ内だけに飛ばすので、セキュリティ的に安全らしいです。

サンプルプロジェクト

ボタンを押すとintentをbloadcastで飛ばしてMyReceiverの中の処理が呼ばれます。

class MainActivity : AppCompatActivity() {
    companion object {
        val ACTION_CALL = "called";
    }
    //レシーバー
    var localReceiver: BroadcastReceiver? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener {
            action()
        }

        localReceiver = MyReceiver()

        //アクションを登録しておく
        val i = IntentFilter()
        i.addAction(MainActivity.ACTION_CALL)
        //マネージャーに登録する
        LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver as MyReceiver, i)
    }
    fun action(){
        val intent = Intent(ACTION_CALL)
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
    }
}

今回はアクションで飛ばすものをACTION_CALL一つしか作成していませんが、これを複数用意すると処理ごとに分けられます。

レシーバークラス

class MyReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        if (action == MainActivity.ACTION_CALL) {
            Log.i("bloadcast", "呼ばれたよ")
        }
    }
}