Dynamic Broadcast
使用Broadcast,可以達到不用理會接收端(receiver)的狀況,一直發送消息。
首先,Create自己的Recevier。
class MyBroadcastRecevier : BroadcastReceiver() {
companion object {
private val TAG = "MyBroadcastRecevier"
}
override fun onReceive(context: Context?, intent: Intent?) {
var string: StringBuilder = StringBuilder()
string.append("Action " + intent!!.action + " ")
string.append("URI " + intent!!.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n")
var log = string.toString()
Log.d("TAG", log)
Toast.makeText(context!!, log, Toast.LENGTH_LONG).show()
}
}
接著在MainActivity中regist recevier。
var br=MyBroadcastRecevier()
....
//register Receiver
var iFilter = IntentFilter()
iFilter.addAction(Config.flag)
// this.registerReceiver(br, iFilter)
LocalBroadcastManager.getInstance(applicationContext).registerReceiver(br, iFilter)
說明一下,由LocalBroadcastManager註冊的Receiver只能接收自己app的Broadcast。
Send Broadcast,一樣使用LocalBroadcastManager,發送消息給內部(自己的app)的Receiver。
sendBtn.setOnClickListener {
var i = Intent()
i.setAction(Config.flag)
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(i)
}
Static Broadcast
首先,先 Create 一個 Receiver。這個東西就算你的 app 是關閉的,他還是會 run 你的 app 中的 Receiver。
class StaticBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//test receiver run main thread
Toast.makeText(context, Thread.currentThread().toString(), Toast.LENGTH_LONG).show()
}
}
然後 AndroidManifest 宣告 Receiver,也就是說只要有 Hello action 的 intent 傳入都會交由 .staticReceiver.StaticBroadcastReceiver 處理。
...
<receiver
android:name=".staticReceiver.StaticBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="Hello" />
/>
</intent-filter>
</receiver>
</application>
發送 Broadcast,Action 設定 Hello。
sendBtn.setOnClickListener {
var i = Intent()
i.setAction("Hello")
sendBroadcast(i)
}