1. Android广播接收器简介

在 Android 中,BroadcastReceiver(广播接收器)是一种组件,用于监听系统广播或应用程序内自定义广播,并在广播发生时接收并处理这些广播。广播接收器可以用于实现组件之间的通信,无论是在同一个应用程序内还是在不同应用程序之间。

广播接收器有两个主要部分:

  1. 注册广播接收器:在 AndroidManifest.xml 文件中声明广播接收器,或者通过代码动态注册广播接收器。这样系统或其他应用程序发送匹配的广播时,广播接收器就会被激活。
  2. 处理广播:广播接收器在接收到广播时,会调用其 onReceive(Context context, Intent intent) 方法。在这个方法中,可以处理接收到的广播,例如读取广播中的数据、执行特定操作或触发其他组件的响应。

以下是一个简单的示例,展示了如何创建一个广播接收器:

// 示例广播接收器类
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("com.example.myapp.MY_CUSTOM_ACTION")) {
            // 处理自定义广播
            String message = intent.getStringExtra("message");
            Toast.makeText(context, "Received broadcast: " + message, Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            // 处理系统广播:插入电源
            Toast.makeText(context, "Power connected!", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            // 处理系统广播:拔出电源
            Toast.makeText(context, "Power disconnected!", Toast.LENGTH_SHORT).show();
        }
    }
}

在上述示例中,我们创建了一个广播接收器 MyBroadcastReceiver,并重写了 onReceive() 方法。根据接收到的广播的 Action(动作),我们在方法中处理不同类型的广播。对于自定义广播,我们从 Intent 中获取消息数据,并显示一个 Toast。对于系统广播 Intent.ACTION_POWER_CONNECTEDIntent.ACTION_POWER_DISCONNECTED,我们也分别显示相应的 Toast。

要使广播接收器能够接收广播,我们需要在 AndroidManifest.xml 文件中声明广播接收器:

<receiver android:name=".MyBroadcastReceiver">
    <!-- 过滤器,指定要监听的广播 -->
    <intent-filter>
        <!-- 自定义广播 -->
        <action android:name="com.example.myapp.MY_CUSTOM_ACTION" />
        <!-- 系统广播:插入电源和拔出电源 -->
        <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
    </intent-filter>
</receiver>

上述代码中,我们在 <receiver> 标签中声明了 MyBroadcastReceiver 广播接收器,并在 <intent-filter> 标签中指定了要监听的广播。这样,MyBroadcastReceiver 就会接收来自 com.example.myapp.MY_CUSTOM_ACTIONIntent.ACTION_POWER_CONNECTEDIntent.ACTION_POWER_DISCONNECTED 的广播。

通过广播接收器,Android 应用程序可以实现不同组件之间的通信和响应,以及对系统广播的监听和处理。广播接收器是一种强大的机制,但在使用时需要注意潜在的性能和安全问题,尽量避免过多地频繁发送广播,以免造成不必要的资源浪费。

2. 广播接收器 静态注册 和 动态注册

在 Android 中,广播接收器(BroadcastReceiver)可以通过两种方式进行注册:静态注册和动态注册。

  1. 静态注册:
  • 静态注册是在 AndroidManifest.xml 文件中声明广播接收器。这意味着广播接收器在应用程序安装时就被注册,不需要在运行时手动注册或注销。
  • 静态注册适用于监听全局广播或在应用程序的整个生命周期内都需要接收广播的场景。当应用程序处于非运行状态时,静态注册的广播接收器仍然可以接收到广播。

示例:在 AndroidManifest.xml 中静态注册广播接收器

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <!-- 添加其他你要监听的广播动作 -->
    </intent-filter>
</receiver>
  1. 动态注册:
  • 动态注册是在代码中通过 Java 来注册广播接收器。这意味着广播接收器在运行时需要手动注册和注销,通常是在特定的时刻注册或在特定的页面/组件中注册。
  • 动态注册适用于临时性的广播接收需求,比如只在特定条件下监听广播,或者在特定 Activity/Fragment 中监听广播。

示例:在代码中动态注册广播接收器

public class MyActivity extends AppCompatActivity {
    private MyBroadcastReceiver myBroadcastReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 创建广播接收器实例
        myBroadcastReceiver = new MyBroadcastReceiver();

        // 创建 IntentFilter,指定要监听的广播动作
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.myapp.MY_CUSTOM_ACTION");
        // 添加其他你要监听的广播动作

        // 注册广播接收器
        registerReceiver(myBroadcastReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 注销广播接收器
        unregisterReceiver(myBroadcastReceiver);
    }
}

需要注意的是,静态注册和动态注册的广播接收器都有各自的适用场景和优缺点。静态注册的广播接收器在应用程序安装时就会注册,无需额外的代码来注册和注销,但它会增加应用程序启动时间和资源占用。而动态注册的广播接收器需要在适当的时机手动注册和注销,相对灵活,但也需要开发者自行管理注册和注销的时机,避免在不需要接收广播时仍然保持注册状态。

开发者应根据具体的需求和场景,选择适合的注册方式来使用广播接收器。

3. 常见系统广播

在 Android 系统中,有许多常用的系统广播,它们可以用于监听设备状态的变化以及接收系统级事件。以下是一些常用的系统广播:

  1. ACTION_BOOT_COMPLETED:当设备完成启动过程后发送此广播。可以在接收此广播后执行一些初始化操作。
  2. ACTION_POWER_CONNECTED:当设备连接电源时发送此广播。
  3. ACTION_POWER_DISCONNECTED:当设备断开电源连接时发送此广播。
  4. ACTION_BATTERY_LOW:当设备电量低于警告阈值时发送此广播。
  5. ACTION_BATTERY_OKAY:当设备电量恢复正常时发送此广播,即设备不再处于低电量状态。
  6. ACTION_SCREEN_ON:当设备的屏幕点亮时发送此广播。
  7. ACTION_SCREEN_OFF:当设备的屏幕关闭时发送此广播。
  8. ACTION_USER_PRESENT:当用户解锁设备并进入主屏幕时发送此广播。
  9. ACTION_TIME_TICK:每分钟发送一次的广播,可以用于更新 UI 中的时间显示。
  10. ACTION_PACKAGE_ADDED:当安装新应用程序时发送此广播。
  11. ACTION_PACKAGE_REMOVED:当卸载应用程序时发送此广播。
  12. ACTION_PACKAGE_REPLACED:当替换安装应用程序时发送此广播。
  13. ACTION_MEDIA_MOUNTED:当外部存储设备(如SD卡)被挂载时发送此广播。
  14. ACTION_MEDIA_UNMOUNTED:当外部存储设备被卸载时发送此广播。
  15. ACTION_HEADSET_PLUG:当耳机插入或拔出时发送此广播。
  16. ACTION_NEW_OUTGOING_CALL:当拨打新电话时发送此广播。
  17. ACTION_ANSWER:当接听电话时发送此广播。
  18. ACTION_CALL_STATE_CHANGED:当电话状态(响铃、接听、挂断等)发生变化时发送此广播。

这些广播可以通过静态注册或动态注册的方式来监听,从而在合适的时机做出相应的响应。注意,不同的 Android 版本可能会有不同的广播行为,因此建议在使用时查阅最新的 Android 官方文档来获取准确的信息。