在 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的步骤如下:
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()方法发送广播消息
```