广播的类型主要分为两种:标准广播和有序广播。
1. 标准广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序。这种广播的效率较高,并且不能被拦截。示例代码如下:
```kotlin
class TimeChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
showToast(it, "收到了时间变化的广播")
}
}
}
// 动态注册系统广播
private val timeChangeReceiver = TimeChangeReceiver()
registerReceiver(timeChangeReceiver, IntentFilter("android.intent.action.TIME_TICK"))
unregisterReceiver(timeChangeReceiver)
```
2. 有序广播
有序广播是一种完全同步的广播,在广播发出后只能有一个BroadcastReceiver能接收到这个广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才能继续向下传递。所以这个广播是有顺序的,因此这种广播也是可以被拦截的。如果被拦截了后面的BroadCastReceiver则不能收到广播消息了。示例代码如下:
```kotlin
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
showToast(it, "收到了有序广播")
}
}
}
// 注册有序广播
private val myBroadcastReceiver = MyBroadcastReceiver()
IntentFilter(INTENT_FILTER_ACTION).apply { registerReceiver(myBroadcastReceiver) }
// 在不需要时注销接收器
unregisterReceiver(myBroadcastReceiver)
```
首先,我们需要创建一个名为`BootcastReceiver`的继承自`BroadcastReceiver`的类。然后,在`ReceiverActivity`中使用静态注册的方式注册这个广播接收器,以便在开机时接收系统时间变化的广播。
以下是重构后的代码:
```kotlin
class ReceiverActivity : AppCompatActivity() {
private var receiver: TimeChangeReceiver? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_receiver)
btn_regist.setOnClickListener {
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_TIME_TICK)
receiver = BootcastReceiver()
registerReceiver(receiver, intentFilter)
}
}
override fun onDestroy() {
super.onDestroy()
receiver?.let {
unregisterReceiver(it)
}
}
}
```
这样我们就通过静态注册的方式注册了系统开机的广播,并在时间变化时接收到了广播。
```kotlin
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
Toast.makeText(context, "开启", Toast.LENGTH_LONG).show()
}
}
}
```
在Manifest中注册receiver的代码如下:
```xml
android:enabled="true">
```
onReceive()方法被调用了两次。
解:$120 * 8\div(4+5)$ $=320/3$(个) 答:平均每个小组分得$\frac{320}{3}$个.
.2、静态注册自定义广播
代码如下:
在AndroidManifest中注册:
```xml
```
创建广播:
```java
class StaticCustomReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
showToast(it, "自定义广播静态注册")
}
}
}
```
发送广播:
```java
val intent = Intent("com.example.abu.listview.StaticCustomReceiver")
intent.setPackage(packageName)
sendBroadcast(intent)
```
在AndroidManifestxml中,我们可以通过为不同的`
以下是代码重构后的XML片段:
```xml
```
在这个重构后的代码中,我们可以看到两个广播接收器都被正确地注册了,并且它们的优先级也已经设置好了。当系统需要发送广播时,它会根据广播接收器的优先级来决定哪个广播接收器应该被触发。
```kotlin
class StaticBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
showToast(it, "另一个静态注册自定义广播")
}
}
}
class StaticCustomReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.let {
showToast(it, "自定义广播静态注册")
abortBroadcast()
}
}
}
```
调用方法:
```kotlin
abortBroadcast()
val intent = Intent(IntentFilter("com.example.abu.listview.StaticCustomReceiver"))
intent.setPackage(packageName)
sendOrderedBroadcast(intent, null)
sendOrderedBroadcast(intent, null)
intentFilter.priority = 100
```