在 Android 中使用 Activity、Service、Broadcast 和 BroadcastReceiver,可以实现各种功能。下面将详细介绍这四个组件及其关系:

1. 活动(Activity):用于表现应用程序的功能界面。用户与应用程序交互的主要方式是通过 Activity。

2. 服务(Service):相当于后台运行的 Activity。它可以在不与用户交互的情况下,执行一些耗时的操作,如下载文件、播放音乐等。

3. 广播(Broadcast):用于发送广播。广播是一种广泛运用的在应用程序之间传输信息的机制。而广播接收器(BroadcastReceiver)是对发送出来的广播进行过滤接受并响应的一类组件。

4. 广播接收器(BroadcastReceiver):用于接收广播。当 Intent 发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 onReceive() 方法。所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceive() 方法。

Intent 是连接以上各个组件,并在其间传递消息的关键对象。要发送广播,首先需要在需要发送信息的地方将要发送的信息和用于过滤的信息(如 Action、Category)装入一个 Intent 对象,然后通过调用 Context.sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 对象以广播方式发送出去。当 Intent 发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 onReceive() 方法。所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceive() 方法。

注册 BroadcastReceiver 有以下两种方式:

1. 一种方式是,静态地在 AndroidManifest.xml 文件中用 标签声明注册,并在标签内用 标签设置过滤器。例如:

```xml

```

2. 另外一种方式是动态注册,即在程序运行过程中通过 Context.registerReceiver() 方法注册。例如:

```java

MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();

Intent intent = new Intent("com.example.MY_ACTION");

context.registerReceiver(myBroadcastReceiver, intent);

```

以下是重构后的文本:

另一种方式是动态注册BroadcastReceiver。首先,在代码中定义并设置好一个IntentFilter对象,然后在需要注册的地方调用Context.registerReceiver()方法。如果取消注册,就调用Context.unregisterReceiver()方法。需要注意的是,如果使用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver会自动取消注册。特别注意,有些需要后台监听的操作,如短信消息。

另外,在使用sendBroadcast()方法时,如果指定了接收权限,那么只有在AndroidManifest.xml中用标签声明了拥有此权限的BroadcastReceiver才有可能接收到发送来的Broadcast。同样,如果在注册BroadcastReceiver时指定了可接收的Broadcast的权限,那么只有在包内的AndroidManifest.xml中用标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。

静态注册BroadcastReceiver的步骤如下:

1. 新建一个类继承BroadcastReceiver。例如:`clsReceiver2.java`。

2. 在AndroidManifest.xml中添加receive标签,包括以下内容:

- 第一个name是类名,即你的继承BroadcastReceiver的类的名字,里面实现了BroadcastReceive的onReceive()方法,用来处理你接到消息的动作。

- 第二个name是action的名称,即你要监听的消息名字(其它消息都会被过滤不监听)。

3. 在需要注册的地方调用`registerReceiver(MyBroadcastReceiver, intentFilter);`来注册监听。

4. 当不再需要监听时,调用`unregisterReceiver(MyBroadcastReceiver);`来取消注册。

```java

// 在onStart中注册监听器

unregisterReceiver(MyBroadcastReceiver);

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);

intentFilter.addCategory(Intent.CATEGORY_DEFAULT);

registerReceiver(MyBroadcastReceiver, intentFilter);

// 在onStop中取消监听器

unregisterReceiver(MyBroadcastReceiver);

```

private class MyBroadcastReceive extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { // 判断是否接到电池变换消息

// 处理内容

}

}

}

```java

// 发送广播消息的示例代码:

Intent intent = new Intent();

intent.setAction("com.example.broadcast.ACTION_BATTERY_CHANGED");

intent.putExtra("status", true); // 添加额外的信息到Intent对象中

sendBroadcast(intent); // 通过调用Context.sendBroadcast()方法发送广播消息

```