深入分析 Android BroadcastReceiver (七)
创始人
2025-01-15 20:04:03
0

文章目录

    • 深入分析 Android BroadcastReceiver (七)
      • 1. 高级应用场景
        • 1.1 示例:动态权限请求
        • 1.2 示例:应用内通知更新
      • 2. 安全性与性能优化
        • 2.1 示例:设置权限防止广播攻击
        • 2.2 示例:使用 LocalBroadcastManager
        • 2.3 示例:在生命周期中注册和取消注册广播接收器
      • 3. 总结

深入分析 Android BroadcastReceiver (七)

1. 高级应用场景

  1. 动态权限请求

在 Android 6.0(API 23)及以上,应用需要在运行时请求权限。BroadcastReceiver 可以用来监听权限变化,并在权限授予或拒绝后采取相应的措施。

1.1 示例:动态权限请求

请求权限:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); 

处理权限请求结果:

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {     super.onRequestPermissionsResult(requestCode, permissions, grantResults);     if (requestCode == REQUEST_CAMERA_PERMISSION) {         if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {             // 权限授予,发送广播             Intent intent = new Intent("com.example.PERMISSION_GRANTED");             sendBroadcast(intent);         } else {             // 权限被拒绝             Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();         }     } } 

监听权限变化的广播接收器:

public class PermissionReceiver extends BroadcastReceiver {     @Override     public void onReceive(Context context, Intent intent) {         if ("com.example.PERMISSION_GRANTED".equals(intent.getAction())) {             // 处理权限授予后的操作             Toast.makeText(context, "Camera permission granted", Toast.LENGTH_SHORT).show();         }     } }  // 在 Manifest 文件中声明接收器                      
  1. 应用内更新通知

通过广播机制可以实现应用内的通知更新,例如某个模块发生了数据更新,需要通知其他模块进行相应的操作。

1.2 示例:应用内通知更新

发送广播通知:

Intent intent = new Intent("com.example.DATA_UPDATED"); intent.putExtra("data", "New data available"); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

接收广播通知:

@Override protected void onStart() {     super.onStart();     IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");     LocalBroadcastManager.getInstance(this).registerReceiver(dataUpdateReceiver, filter); }  @Override protected void onStop() {     super.onStop();     LocalBroadcastManager.getInstance(this).unregisterReceiver(dataUpdateReceiver); }  private final BroadcastReceiver dataUpdateReceiver = new BroadcastReceiver() {     @Override     public void onReceive(Context context, Intent intent) {         String data = intent.getStringExtra("data");         // 处理数据更新         Toast.makeText(context, "Data updated: " + data, Toast.LENGTH_SHORT).show();     } }; 

2. 安全性与性能优化

  1. 避免广播攻击

公共广播可能会被恶意应用利用进行广播攻击,导致安全问题。为广播接收器设置合适的权限可以有效防止此类攻击。

2.1 示例:设置权限防止广播攻击

发送广播时设置权限:

Intent intent = new Intent("com.example.SECURE_ACTION"); sendBroadcast(intent, "com.example.MY_PERMISSION"); 

接收器声明权限:

                     
  1. 使用 LocalBroadcastManager

LocalBroadcastManager 仅在应用内部进行广播通信,具有更高的安全性和效率。

2.2 示例:使用 LocalBroadcastManager

发送本地广播:

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this); Intent intent = new Intent("com.example.LOCAL_EVENT"); localBroadcastManager.sendBroadcast(intent); 

接收本地广播:

@Override protected void onStart() {     super.onStart();     IntentFilter filter = new IntentFilter("com.example.LOCAL_EVENT");     LocalBroadcastManager.getInstance(this).registerReceiver(localEventReceiver, filter); }  @Override protected void onStop() {     super.onStop();     LocalBroadcastManager.getInstance(this).unregisterReceiver(localEventReceiver); }  private final BroadcastReceiver localEventReceiver = new BroadcastReceiver() {     @Override     public void onReceive(Context context, Intent intent) {         // 处理本地事件         Toast.makeText(context, "Local event received", Toast.LENGTH_SHORT).show();     } }; 
  1. 合理的生命周期管理

在组件的生命周期中合理注册和取消注册广播接收器,避免内存泄漏和资源浪费。

2.3 示例:在生命周期中注册和取消注册广播接收器
@Override protected void onStart() {     super.onStart();     IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");     registerReceiver(someReceiver, filter); }  @Override protected void onStop() {     super.onStop();     unregisterReceiver(someReceiver); }  private final BroadcastReceiver someReceiver = new BroadcastReceiver() {     @Override     public void onReceive(Context context, Intent intent) {         // 处理接收到的广播     } }; 

3. 总结

广播机制在 Android 中是一个非常灵活和强大的组件通信方式,适用于多种应用场景。通过系统广播、自定义广播、有序广播和本地广播,可以实现多样化的通信需求。在实际应用中,开发者需要结合具体需求,选择合适的广播机制,并通过优化策略提升应用的性能和安全性。

  • 动态权限请求:使用广播机制监听权限变化,及时处理权限授予或拒绝后的操作。
  • 应用内更新通知:通过广播实现模块间的数据更新通知,保持组件间的松耦合。
  • 安全性优化:通过设置权限和使用 LocalBroadcastManager 提升广播的安全性,避免广播攻击。
  • 性能优化:合理管理广播接收器的生命周期,避免内存泄漏和资源浪费。

通过合理运用广播机制及其优化策略,开发者可以有效提升应用的可维护性、稳定性和安全性,从而构建高质量的 Android 应用。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

相关内容

热门资讯

必看攻略(德州wpk德州)软件... 必看攻略(德州wpk德州)软件透明挂(辅助挂)透明辅助挂软件(2022已更新)(哔哩哔哩);1、完成...
第六辅助挂(大厅wpk)软件透... 第六辅助挂(大厅wpk)软件透明挂(透视)外挂辅助器软件(2024已更新)(哔哩哔哩);致您一封信;...
8分钟了解花花生活圈app脚本... 您好,花花生活圈app脚本这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩...
发现一款(微扑克)软件透明挂(... 发现一款(微扑克)软件透明挂(透视)外挂辅助器透视挂(2022已更新)(哔哩哔哩)是一款可以让一直输...
最新通报(竞技德州联盟扑克)软... 最新通报(竞技德州联盟扑克)软件透明挂(辅助挂)透明辅助挂脚本(2021已更新)(哔哩哔哩);竞技德...
揭秘真相骨牌透视外挂!太难了原... 相信很多朋友都在电脑上玩过骨牌透视外挂吧,但是很多朋友都在抱怨用电脑玩起来不方便。为此小编给大家带来...
热点推荐(Wepoke脚本)软... 热点推荐(Wepoke脚本)软件透明挂(透视)外挂辅助器神器(2025已更新)(哔哩哔哩);Wepo...
几个辅助挂闲来十三水有外挂的!... 几个辅助挂闲来十三水有外挂的!太难了原来是有挂(2020已更新)(有挂推荐);1、不需要AI权限,帮...
辅助挂讲解嘉兴黑桃a外挂!太过... 辅助挂讲解嘉兴黑桃a外挂!太过分了其实确实是真的有挂(2023已更新)(有挂总结);1、点击下载安装...
实测辅助挂掌酷十三张系统规律!... 您好,掌酷十三张系统规律这款游戏可以开挂的,确实是有挂的,需要了解加微【757446909】很多玩家...