(二十七)Android开发中广播(Broadcast)技术详解

(二十七)Android开发中广播(Broadcast)技术详解

在 Android 开发中,广播(Broadcast) 是一种广泛使用的组件通信机制,它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项,并结合具体的代码示例,帮助你全面掌握这一技术。

广播的基本概念

广播 是一种跨应用的消息传递机制,任何应用都可以发送广播,其他应用只要拥有相应权限即可接收。广播的本质是通过 Intent 对象携带消息,在系统或应用间分发。

广播的类型

普通广播(Normal Broadcast):异步发送,所有接收者几乎同时收到消息。

有序广播(Ordered Broadcast):同步发送,接收者按优先级顺序处理,可中断。

粘性广播(Sticky Broadcast):已废弃,不推荐使用。

本地广播(Local Broadcast):仅在应用内部传递,效率更高且更安全。

广播的生命周期

广播接收者(BroadcastReceiver)在接收到广播时执行 onReceive 方法,处理完成后即销毁。因此,onReceive 不应执行耗时操作。

广播的发送与接收

2.1 发送广播

发送广播通过 sendBroadcast 方法实现,需要指定一个 Intent 对象。

Intent intent = new Intent(“com.example.MY_ACTION”);

intent.putExtra(“key”, “value”);

sendBroadcast(intent);

2.2 接收广播

接收广播需要注册 BroadcastReceiver,注册方式分为静态和动态两种。

静态注册

在 AndroidManifest.xml 中声明,适用于系统级广播,即使应用未运行也能接收。

动态注册

在代码中注册,通常在 Activity 或 Service 中,应用运行时有效。

MyReceiver receiver = new MyReceiver();

IntentFilter filter = new IntentFilter(“com.example.MY_ACTION”);

registerReceiver(receiver, filter);

注销:动态注册的接收者需在适当时候注销,例如在 onDestroy 中:

unregisterReceiver(receiver);

BroadcastReceiver 实现

public class MyReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

String value = intent.getStringExtra(“key”);

// 处理接收到的数据

}

}

广播类型详解

3.1 普通广播

特点:异步,所有接收者几乎同时接收。

使用场景:通知多个组件同时执行操作,如更新 UI。

示例:

Intent intent = new Intent(“com.example.UPDATE_UI”);

sendBroadcast(intent);

3.2 有序广播

特点:同步,接收者按优先级顺序接收,可通过 abortBroadcast() 中断。

优先级:通过 android:priority 设置,值越大优先级越高。

示例:

Intent intent = new Intent(“com.example.ORDERED_ACTION”);

sendOrderedBroadcast(intent, null);

AndroidManifest.xml 设置优先级:

中断广播:

public class HighPriorityReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

// 处理逻辑

abortBroadcast(); // 中断广播

}

}

3.3 本地广播

特点:使用 LocalBroadcastManager,仅在应用内部传递。

优势:效率高,防止广播泄露。

示例:

// 发送本地广播

LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

// 注册接收者

LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);

// 注销接收者

LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);

广播的使用场景

4.1 系统广播

Android 系统会发送多种广播,如电量变化、网络状态变化等。

示例:监听电量变化。

public class BatteryReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

int level = intent.getIntExtra(“level”, 0);

// 处理电量变化

}

}

4.2 自定义广播

用于应用内组件通信。

示例:Service 发送广播通知 Activity 更新数据。

// 在 Service 中

Intent intent = new Intent(“com.example.DATA_UPDATED”);

sendBroadcast(intent);

// 在 Activity 中

public class MyActivity extends AppCompatActivity {

private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

// 更新 UI

}

};

@Override

protected void onResume() {

super.onResume();

IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");

registerReceiver(receiver, filter);

}

@Override

protected void onPause() {

super.onPause();

unregisterReceiver(receiver);

}

}

4.3 权限控制

通过权限限制广播的发送和接收。

发送时指定权限:

sendBroadcast(intent, “com.example.PERMISSION”);

接收时声明权限:

注意事项

性能:onReceive 在主线程执行,避免耗时操作。

安全性:避免泄露敏感信息,推荐本地广播或权限控制。

生命周期:动态注册的接收者需及时注销,防止内存泄漏。

Android 8.0+ 限制:静态注册对部分系统广播无效,建议动态注册或使用 JobScheduler。

完整代码示例

以下是一个完整的示例,展示 Service 发送广播,Activity 动态接收并更新 UI。

Service 发送广播:

public class MyService extends Service {

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

new Thread(() -> {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

Intent broadcastIntent = new Intent(“com.example.DATA_UPDATED”);

broadcastIntent.putExtra(“data”, “Hello from Service”);

sendBroadcast(broadcastIntent);

}).start();

return super.onStartCommand(intent, flags, startId);

}

@Override

public IBinder onBind(Intent intent) {

return null;

}

}

Activity 接收广播:

public class MainActivity extends AppCompatActivity {

private TextView textView;

private BroadcastReceiver receiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = findViewById(R.id.textView);

receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

String data = intent.getStringExtra("data");

textView.setText(data);

}

};

IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");

registerReceiver(receiver, filter);

startService(new Intent(this, MyService.class));

}

@Override

protected void onDestroy() {

super.onDestroy();

unregisterReceiver(receiver);

}

}

总结

Android 广播是组件通信的重要工具,适用于系统事件监听、应用间通信等多种场景。

相关推荐

港版苹果7质量如何?品质保证与用户口碑解析(港版苹果7品质评估,为您解读真实使用体验)
风暴英雄配置要求一览 五种硬件检测供玩家体验
365bet中国大陆网址

风暴英雄配置要求一览 五种硬件检测供玩家体验

2025-07-12 👁️ 2622
风暴英雄配置要求一览 五种硬件检测供玩家体验
365bet中国大陆网址

风暴英雄配置要求一览 五种硬件检测供玩家体验

2025-07-12 👁️ 2622
疫情下,跨境医疗平台MORE Health区域扩张、四大业务日渐成熟
酷狗音乐怎样加好友?添加好友流程一览
365bet中国大陆网址

酷狗音乐怎样加好友?添加好友流程一览

2025-10-31 👁️ 8874
刷脸考勤机系统多少钱?价格影响因素有哪些揭秘