Android中的广播创建与使用场景

在Android中,广播(Broadcast)是一种全局的消息传递机制,用于在不同组件(如Activity、Service、Fragment)甚至不同应用之间传递事件。以下是关于广播的详细介绍:

一、广播的核心概念

广播分为三种类型:

  1. 普通广播(Normal Broadcast)

    • 异步发送,所有接收器并行接收,无法中断。
    • 使用 sendBroadcast() 发送。
  2. 有序广播(Ordered Broadcast)

    • 同步发送,按优先级依次传递给接收器,可被拦截或修改数据。
    • 使用 sendOrderedBroadcast() 发送。
  3. 粘性广播(Sticky Broadcast)

    • 已废弃(Android 5.0+),允许在发送后仍能被后续注册的接收器接收。

二、广播的创建步骤

1. 定义广播接收器(BroadcastReceiver)
// 方式一:静态注册(在AndroidManifest.xml中声明)
<receiver android:name=".MyReceiver">
    <intent-filter>
        <action android:name="com.example.MY_CUSTOM_ACTION" />
    </intent-filter>
</receiver>

// 方式二:动态注册(在代码中注册)
public class MainActivity extends AppCompatActivity {
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("com.example.MY_CUSTOM_ACTION")) {
                String data = intent.getStringExtra("key");
                Log.d("MainActivity", "Received: " + data);
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_ACTION");
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiver); // 避免内存泄漏
    }
}
2. 发送广播
// 发送普通广播
Intent intent = new Intent("com.example.MY_CUSTOM_ACTION");
intent.putExtra("key", "Hello from sender");
sendBroadcast(intent);

// 发送有序广播(带权限和结果接收器)
sendOrderedBroadcast(intent, null, null, null, 
    Activity.RESULT_OK, null, null);

三、广播的典型使用场景

1. 系统事件监听

监听网络变化、电量变化、屏幕开关等系统事件:

// 监听网络连接变化
public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm = (ConnectivityManager) 
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            Log.d("NetworkReceiver", "Network connected");
        } else {
            Log.d("NetworkReceiver", "Network disconnected");
        }
    }
}
2. 组件间通信

在Activity、Service、Fragment之间解耦通信:

// 在Service中发送广播通知Activity
public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 任务完成后发送广播
        Intent broadcastIntent = new Intent("com.example.TASK_COMPLETED");
        sendBroadcast(broadcastIntent);
        return START_STICKY;
    }
}
3. 跨应用通信

允许不同应用之间传递数据:

// 发送跨应用广播(需指定包名或权限)
Intent intent = new Intent("com.example.EXTERNAL_ACTION");
intent.setPackage("com.other.app"); // 指定目标应用包名
sendBroadcast(intent);
4. 后台任务通知

在后台任务完成时通知UI更新:

// 文件下载完成后通知Activity
public class DownloadService extends IntentService {
    @Override
    protected void onHandleIntent(Intent intent) {
        // 下载文件...
        Intent broadcastIntent = new Intent("com.example.DOWNLOAD_COMPLETED");
        sendBroadcast(broadcastIntent);
    }
}

四、广播的优缺点

优点
  • 解耦组件:发送者和接收者无需直接引用。
  • 系统级通知:可监听系统事件(如网络变化)。
  • 跨进程通信:支持不同应用间传递数据。
缺点
  • 性能开销:广播机制涉及反射和全局消息传递,频繁使用会影响性能。
  • 安全风险:静态广播可能被恶意应用拦截或利用。
  • 不可靠性:广播发送后无法保证接收者一定能处理。

五、替代方案(优先考虑)

  1. LocalBroadcastManager

    • 仅在应用内传播,更安全高效:
    // 注册本地广播
    LocalBroadcastManager.getInstance(context)
        .registerReceiver(receiver, new IntentFilter("LOCAL_ACTION"));
    
    // 发送本地广播
    LocalBroadcastManager.getInstance(context)
        .sendBroadcast(new Intent("LOCAL_ACTION"));
    
  2. EventBus/RxJava

    • 基于观察者模式的事件总线,更适合组件间通信:
    // 使用EventBus发送事件
    EventBus.getDefault().post(new MyEvent("Data"));
    
    // 订阅事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMyEvent(MyEvent event) {
        // 处理事件
    }
    
  3. ViewModel + LiveData

    • 适合Activity与Fragment间的通信,生命周期安全:
    // ViewModel中定义LiveData
    public class SharedViewModel extends ViewModel {
        private final MutableLiveData<String> data = new MutableLiveData<>();
        public void setData(String value) { data.setValue(value); }
        public LiveData<String> getData() { return data; }
    }
    

六、使用建议

  1. 优先使用LocalBroadcast:避免全局广播的安全风险和性能开销。
  2. 减少静态广播:Android 8.0+对隐式静态广播有限制,建议动态注册。
  3. 避免在广播中执行耗时操作:可能导致ANR(Application Not Responding)。
  4. 注意内存泄漏:动态注册的广播必须在onDestroy()中取消注册。

总结

广播是Android中强大的通信机制,但需谨慎使用。在大多数场景下,LocalBroadcastManagerEventBusViewModel是更优选择,仅在需要系统级事件监听或跨应用通信时才使用全局广播。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值