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