Android四大组件:Broadcast

Android四大组件:Broadcast

-1. 标准广播(Normal broadcasts)

  • 执行特性:完全异步,广播发出后,所有接收器几乎同时接收,无先后顺序。
  • 效率与拦截:效率高,但无法被截断 。
  • 流程:发出广播后,多个接收器同时接收,中 “发出广播” 向 “广播接收器 1、2、3” 同时传递。
  • 有序广播(Ordered broadcasts)
    • 执行特性:同步执行,同一时刻仅一个接收器接收,执行完逻辑后广播才继续传递,接收器有先后顺序,优先级高的先接收 。
    • 拦截可能:前面的接收器可截断广播,使后面的无法收到 。
    • 流程:按顺序传递,如 “发出广播→广播接收器 1→广播接收器 2→广播接收器 3”,且前序接收器可截断。

      文章目录

      • Android四大组件:Broadcast
          • 1.系统广播
            • 1.1 动态注册监听系统广播
            • 1.2静态注册监听系统广播
          • 2.标准广播
          • 3.有序广播

1.系统广播

1.1 动态注册监听系统广播
  1. 系统广播基础:Android 内置诸多系统级广播(如开机完成、电量变化、时间 / 时区变更等 ),可通过广播接收器监听,获取系统状态信息。
  2. 广播接收器创建:新建类继承 BroadcastReceiver,并重写 onReceive() 方法,广播到来时该方法执行,处理逻辑写在此处。
  3. 广播注册方式:分动态注册(代码中注册)和静态注册(AndroidManifest.xml 中注册 )。
  4. 动态注册示例(监听网络变化)
    • 新建项目后,在MainActivity中操作:
      • 定义 IntentFilter(意图过滤器,指定要监听的广播动作 )和 NetworkChangeReceiver(自定义广播接收器 )。
      • onCreate() 里初始化 IntentFilter,添加监听动作(如 android.net.conn.CONNECTIVITY_CHANGE 监听网络变化 ),创建接收器实例并注册(registerReceiver )。
      • onDestroy() 中取消注册(unregisterReceiver ),避免内存泄漏。
      • 自定义 NetworkChangeReceiver 类,在 onReceive 中通过 Toast 提示网络变化,演示广播接收后的逻辑处理 。
        这些内容是学习 Android 广播机制动态注册及监听系统广播的基础流程与关键步骤。
// 导入必要的 Android 相关包
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    // 意图过滤器,用于指定要监听的广播动作
    private IntentFilter intentFilter;
    // 自定义的网络变化广播接收器
    private NetworkChangeReceiver networkChangeReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 初始化意图过滤器
        intentFilter = new IntentFilter();
        // 添加要监听的广播动作:网络连接变化
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_CHANGE);
        
        // 创建广播接收器实例
        networkChangeReceiver = new NetworkChangeReceiver();
        // 注册广播接收器,将意图过滤器和接收器关联
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 当 Activity 销毁时,取消广播接收器的注册,防止内存泄漏
        unregisterReceiver(networkChangeReceiver);
    }

    // 自定义广播接收器类,继承自 BroadcastReceiver
    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 当接收到网络变化广播时,弹出 Toast 提示
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
}
  1. 静态注册特点:可让程序未启动时接收广播(弥补动态注册需程序启动后注册的不足 ),用于实现开机启动等功能。
  2. 创建步骤:在 Android Studio 中通过 com.example.broadcasttest 包 → NewOtherBroadcast Receiver 路径创建,命名 BootCompleteReceiver 并勾选 Exported(允许接收外部广播 )、Enabled(启用接收器 )属性。
  3. 功能实现:在 BootCompleteReceiveronReceive 方法中编写逻辑(如示例里通过 Toast 提示开机完成 ),需结合清单文件配置开机广播权限(文档未提及但实际开发需添加 `` ) 。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasttest">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            intent-filter>
        receiver>
    application>
manifest>
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
    }
}
1.2静态注册监听系统广播
  1. 静态广播注册基础**:静态广播接收器需在 AndroidManifest.xml标签内通过 注册,指定 nameenabledexported 等属性,创建时 Android Studio 可自动完成基础注册。

  2. 接收开机广播条件:除基础注册,需添加权限

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    

    ,并在 内配置 ,通过 声明接收开机完成广播。

  3. 代码作用:完成上述配置后,BootCompleteReceiver 才能在设备开机完成时,通过 onReceive 方法触发 Toast 提示,实现监听开机广播功能 。

2.标准广播

1.广播接收器创建

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

2.清单文件(AndroidManifest.xml)配置

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
    intent-filter>
receiver>

3.布局文件(activity_main.xml)修改

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Broadcast" />
LinearLayout>

4.Activity 代码(MainActivity.java)

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}

核心逻辑

  • 静态注册广播接收器,确保应用未启动也可理论接收(实际受系统限制,标准广播无需关注此点 )。
  • 通过按钮点击触发 sendBroadcast() 发送标准广播,所有监听对应 Action 的接收器(如 MyBroadcastReceiver )会同时收到广播并执行 onReceive 逻辑。
  • 体现 “标准广播”异步、无序、无法截断的特点(文档后续会对比有序广播 )。

关键概念关联

  • 标准广播:发送后所有匹配接收器同时响应,无先后顺序,代码中通过 sendBroadcast() 实现。
  • 静态注册:广播接收器在 AndroidManifest.xml 中配置,不依赖 Activity 启动即可注册(区别于动态注册

3.有序广播

发送有序广播(修改 MainActivity):

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
        sendOrderedBroadcast(intent, null); // 发送有序广播
    }
});

设置接收器优先级(修改 BroadcastTest2 清单文件)

<intent-filter android:priority="100">
    <action android:name="com.example.broadcasttest.MY_BROADCAST" />
intent-filter>

截断广播(修改 MyBroadcastReceiver):

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        abortBroadcast(); // 截断广播,阻止后续接收器接收
    }
}

有序广播特性

  • 按优先级顺序接收,优先级高的接收器先执行 onReceive
  • 可通过 abortBroadcast() 截断广播,控制传递流程。

你可能感兴趣的:(安卓开发学习,android)