深入分析 Android BroadcastReceiver (二)

打印 上一主题 下一主题

主题 525|帖子 525|积分 1575

深入分析 Android BroadcastReceiver (二)

1. 深入明白 BroadcastReceiver 的高级使用和优化

BroadcastReceiver 是 Android 中用于接收广播消息的重要组件。通过对 BroadcastReceiver 的高级使用和优化,开发者可以实现更加高效、灵活的应用逻辑。
2. 有序广播(Ordered Broadcasts)

有序广播允许多个接收器按照优先级次序接收广播,并且可以中断广播的流传。
2.1 实现有序广播


  • 发送有序广播
  1. Intent intent = new Intent("com.example.ORDERED_ACTION");
  2. sendOrderedBroadcast(intent, null);
复制代码

  • 接收有序广播
在 AndroidManifest.xml 中声明接收器,并设置优先级。
  1. <receiver android:name=".OrderedReceiver" android:priority="100">
  2.     <intent-filter>
  3.         <action android:name="com.example.ORDERED_ACTION" />
  4.     </intent-filter>
  5. </receiver>
复制代码
实现 BroadcastReceiver:
  1. public class OrderedReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         // 处理有序广播
  5.         // 可以调用 abortBroadcast() 来中断广播
  6.         abortBroadcast();
  7.     }
  8. }
复制代码
3. 粘性广播(Sticky Broadcasts)

粘性广播已被弃用,但仍旧可以在某些特定场景下使用。它允许广播在发送后被体系保留,后续接收器可以获取到最后一次的广播内容。
3.1 使用粘性广播


  • 发送粘性广播
  1. Intent intent = new Intent("com.example.STICKY_ACTION");
  2. sendStickyBroadcast(intent);
复制代码

  • 接收粘性广播
动态注册接收器来接收粘性广播。
  1. IntentFilter filter = new IntentFilter("com.example.STICKY_ACTION");
  2. registerReceiver(stickyReceiver, filter);
复制代码

  • 扫除粘性广播
  1. removeStickyBroadcast(intent);
复制代码
4. 本地广播(LocalBroadcastManager)

本地广播是一种在应用内部发送广播的机制,避免跨历程通信的开销,同时增加安全性。
4.1 使用本地广播


  • 发送本地广播
  1. LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
  2. Intent localIntent = new Intent("com.example.LOCAL_ACTION");
  3. localBroadcastManager.sendBroadcast(localIntent);
复制代码

  • 接收本地广播
  1. LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context);
  2. BroadcastReceiver localReceiver = new BroadcastReceiver() {
  3.     @Override
  4.     public void onReceive(Context context, Intent intent) {
  5.         // 处理本地广播
  6.     }
  7. };
  8. IntentFilter localFilter = new IntentFilter("com.example.LOCAL_ACTION");
  9. localBroadcastManager.registerReceiver(localReceiver, localFilter);
复制代码
5. 安全性与权限管理

为了进步安全性,广播接收器可以声明权限,以确保只有具有相应权限的应用程序才能发送或接收广播。
5.1 声明权限

在 AndroidManifest.xml 中声明接收器的权限:
  1. <receiver android:name=".MyBroadcastReceiver" android:permission="com.example.MY_PERMISSION">
  2.     <intent-filter>
  3.         <action android:name="com.example.SENSITIVE_ACTION" />
  4.     </intent-filter>
  5. </receiver>
复制代码
发送广播时指定权限:
  1. Intent intent = new Intent("com.example.SENSITIVE_ACTION");
  2. sendBroadcast(intent, "com.example.MY_PERMISSION");
复制代码
6. 性能优化

6.1 避免耗时操纵

在 onReceive 方法中执行耗时操纵会壅闭广播的处理,导致应用卡顿。可以通过启动 Service 或使用 AsyncTask 来处理耗时操纵。
  1. @Override
  2. public void onReceive(Context context, Intent intent) {
  3.     Intent serviceIntent = new Intent(context, MyIntentService.class);
  4.     context.startService(serviceIntent);
  5. }
复制代码
6.2 动态注册和取消注册

动态注册的 BroadcastReceiver 应在合适的生命周期方法中注册和取消注册,以避免内存泄漏和无用的广播接收。
  1. @Override
  2. protected void onStart() {
  3.     super.onStart();
  4.     IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
  5.     registerReceiver(myReceiver, filter);
  6. }
  7. @Override
  8. protected void onStop() {
  9.     super.onStop();
  10.     unregisterReceiver(myReceiver);
  11. }
复制代码
6.3 使用本地广播

只管使用 LocalBroadcastManager 发送和接收广播,淘汰跨历程通信的开销。
7. 实战示例

以下是一个综合示例,展示了如何使用本地广播、有序广播以及优化策略:
7.1 本地广播接收器

  1. public class LocalReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         // 处理本地广播
  5.     }
  6. }
复制代码
7.2 动态注册和取消注册

  1. public class MainActivity extends AppCompatActivity {
  2.     private LocalReceiver localReceiver;
  3.     private LocalBroadcastManager localBroadcastManager;
  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_main);
  8.         localBroadcastManager = LocalBroadcastManager.getInstance(this);
  9.         localReceiver = new LocalReceiver();
  10.     }
  11.     @Override
  12.     protected void onStart() {
  13.         super.onStart();
  14.         IntentFilter filter = new IntentFilter("com.example.LOCAL_ACTION");
  15.         localBroadcastManager.registerReceiver(localReceiver, filter);
  16.     }
  17.     @Override
  18.     protected void onStop() {
  19.         super.onStop();
  20.         localBroadcastManager.unregisterReceiver(localReceiver);
  21.     }
  22.     private void sendLocalBroadcast() {
  23.         Intent intent = new Intent("com.example.LOCAL_ACTION");
  24.         localBroadcastManager.sendBroadcast(intent);
  25.     }
  26. }
复制代码
7.3 有序广播接收器

  1. public class OrderedReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         // 处理有序广播
  5.     }
  6. }
复制代码
7.4 AndroidManifest.xml 中声明

  1. <receiver android:name=".OrderedReceiver" android:priority="100">
  2.     <intent-filter>
  3.         <action android:name="com.example.ORDERED_ACTION" />
  4.     </intent-filter>
  5. </receiver>
复制代码
8. 总结

BroadcastReceiver 是 Android 中处理广播消息的重要组件。通过公道使用本地广播、有序广播、粘性广播等高级特性,以及优化注册和处理过程,可以进步应用的性能和安全性。在实际项目中,开发者需要根据具体需求选择合适的广播机制,并遵循最佳实践以确保应用的稳定性和高效性。
接待点赞|关注|收藏|批评,您的肯定是我创作的动力


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表