如何使用BroadcastReceiver(kotlin)

如何使用BroadcastReceiver(kotlin)

情境

通常廣播是用來通知系統,有某些系統資訊已經完成了,例如收到一封簡訊啊、電池用量有變化或者有人打電話進來等等,這些都會用到廣播,廣播會流通在系統內,很多程式都會接收到廣播,但是會處理該廣播的訊息只會有某幾個程式而已,就很像學校裡會用廣播通知某某某到訓導處,很多同學或老師都會聽到,但是會去訓導處的只有某某某。

完整程式碼

你可以到 GitHub 上面觀看或下載完整程式碼。

程式碼說明

首先定義一個 Button,它是用來送出一個廣播訊息,當接收廣播的程式收到以後,就會跳出一個視窗顯示我收到了。
首先在 MainActivity 中定義我們的 xml。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button android:text="send broadcast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/send_broadcast"/>
</RelativeLayout>

接著 MainActivity 加入廣播的監聽事件。

class MainActivity : AppCompatActivity() {  
 companion object {  
  const val MY_MESSAGE = "com.givemepass.sendmessage"  
 }  

 override fun onCreate(savedInstanceState: Bundle?) {  
  super.onCreate(savedInstanceState)  
  setContentView(R.layout.activity_main)  
  registerReceiver(mBroadcast, IntentFilter(MY_MESSAGE))  
  send_broadcast.setOnClickListener {  
   val intent = Intent()  
   intent.action = MY_MESSAGE  
   sendBroadcast(intent)  
  }  
 }  

 private val mBroadcast = object : BroadcastReceiver() {  
  override fun onReceive(context: Context?, intent: Intent?) {  
   if (MY_MESSAGE == intent?.action) {  
    AlertDialog.Builder(this@MainActivity)  
    .setMessage("收到訊息!")  
    .setPositiveButton("確定") { _, _ -> }  
    .show()  
   }  
  }  

 }  

 override fun onPause() {  
  super.onPause()  
  unregisterReceiver(mBroadcast)  
 }  
}

在 onCreate 的時候,就對系統註冊我們下面所寫的廣播類別。

registerReceiver(mBroadcast, new IntentFilter(MY_MESSAGE))

這個廣播類別是專門接收傳送出來的各類訊息,而我們篩選出 MY_MESSAGE 裡面的字串。

if(MY_MESSAGE == intent?.action){
    //...
}

當我們截取到這樣的字串, 就會跳出一個視窗顯示我們收到了!

new AlertDialog.Builder(BroadcastReceiverDemoActivity.this)
    .setMessage("收到訊息!")
    .setPositiveButton("確定", new DialogInterface.OnClickListener(){
        @Override
        public void onClick(DialogInterface dialog, int which) {
         // TODO Auto-generated method stub
         unregisterReceiver(mBroadcast);
     }
    })
    .show();