6.3.1 发送标准广播
在发送广播之前,我们还是需要先定义一个BroadcastReceiver 来接收此广播,不然发出去也是白发。因此新建一个 MyBroadcastReceiver,并且重写onReceiver 方法:
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show()
}
然后我们在activity_main.xml 中定义一个发送广播的按钮,在MainActivity 中编写发送广播代码。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 发送广播
button.setOnClickListener {
val intent = Intent("com.example.broadcasttest.MY_BROADCAST") // AndroidManifest.xml 中定义的广播动作。
intent.setPackage(packageName) // 指定报名,让系统知道广播是发给哪个程序的,让隐式广播变为显示广播。
sendBroadcast(intent)
}
}
}
这样就可以发送了吗,要留意注释哦,由于广播是用Intent 来发送的,因此还可以在Intent 中携带一些信息。
6.3.2 发送有序广播
和发送标准广播不同,标准广播是异步的,而有序广播是一种同步执行的广播,也就是排队执行,并且是可以被截断的。为了验证这一点我们需要再创建一个新的BroadcastReceiver ,新建AnotherBroadcastReceiver :
class AnotherBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in AnotherBroadcastReceiver", Toast.LENGTH_LONG).show()
}
}
Androidmanifest.xml
<receiver
android:name=".AnotherBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
两个相同的action 我们发送标准广播,会同时弹出两个Toast,我们可以试试。
接下来我们修改一下MainActivity 中的发送广播代码,发送一个有序广播。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 发送广播
button.setOnClickListener {
val intent = Intent("com.example.broadcasttest.MY_BROADCAST") // AndroidManifest.xml 中定义的广播动作。
intent.setPackage(packageName) // 指定报名,让系统知道广播是发给哪个程序的,让隐式广播变为显示广播。
sendOrderedBroadcast(intent,null) // 第二个参数是权限
}
}
}
重新运行程序,发现两个广播还是都可以接收到这条广播,看起来和标准没区别,但是广播是有先后顺序的,只是太快没看出来而以,我们截断一下广播,阻止广播继续传递。
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_LONG).show()
abortBroadcast() // 截断广播函数!
}
}
设置一下Androidmanifest.xml 的广播接收者优先级,确保这个广播接收者第一时间收到广播
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<!-- 设置了优先级 100 保证一定会在其他广播接受者前面接收到广播-->
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
好了,完成了~就不总结了,就这么简单。