广播的类型主要分为两种:标准广播和有序广播。

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:exported="true"

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中,我们可以通过为不同的``元素设置`android:name`属性来注册有序广播。在这个例子中,我们有两个广播接收器:`StaticCustomReceiver`和`StaticBroadcastReceiver`,它们的优先级分别为100和90。为了实现这个功能,我们需要将这两个广播接收器的`android:priority`属性分别设置为100和90。

以下是代码重构后的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

```