广播机制(Kotlin)
接收系统广播
动态注册
1 | class MainActivity : AppCompatActivity() { |
查看完整的系统广播列表(查看路径):
静态注册
特点:开机自启动
步骤:
使用Android Studio创建的Broadcast Receiver,会自动注册
添加相应的权限并添加action属性
1
2
3
4
5
6class BootCompleteReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show()
}
}1
2
3
4
5
6
7
8
9<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
发送自定义广播
发送标准广播
新建BroadcastReceiver并定义接收逻辑
在Manifest.xml中添加action属性
构建Intent对象发送广播
1
2
3
4
5
6
7class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show()
abortBroadcast()
}
}1
2
3
4
5
6
7
8<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class MainActivity : AppCompatActivity() {
// 声明视图绑定变量
private lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 初始化视图绑定
binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 设置按钮点击事件
binding.button.setOnClickListener {
// 创建自定义广播Intent
val intent=Intent("com.example.broadcasttest.MY_BROADCAST")
// 设置包名,将隐式广播转换为显式广播(Android 8.0及以上版本要求)
intent.setPackage(packageName)
//发送标准广播
sendBroadcast(intent)
}
}
发送有序广播
新建广播接收器
添加action属性并设置优先级
利用sendOrderedBroadcast()发送广播
在广播接收器中使用abortBroadcast()方法可以中断后续广播发送
1
2
3
4
5
6class AnotherBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show()
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<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 android:priority="100">//设置优先级
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>1
2
3
4
5
6
7
8
9// 设置按钮点击事件
binding.button.setOnClickListener {
// 创建自定义广播Intent
val intent=Intent("com.example.broadcasttest.MY_BROADCAST")
// 设置包名,将隐式广播转换为显式广播(Android 8.0及以上版本要求)
intent.setPackage(packageName)
// 发送有序广播
sendOrderedBroadcast(intent,null)
}1
2
3
4
5
6
7
8class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show()
//截断广播
abortBroadcast()
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Auroraの世界!




