• 深入分析 Android BroadcastReceiver (七)


    深入分析 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 文件中声明接收器
    <receiver android:name=".PermissionReceiver">
        <intent-filter>
            <action android:name="com.example.PERMISSION_GRANTED"/>
        </intent-filter>
    </receiver>
    
    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");
    

    接收器声明权限:

    <receiver android:name=".SecureReceiver" android:permission="com.example.MY_PERMISSION">
        <intent-filter>
            <action android:name="com.example.SECURE_ACTION"/>
        intent-filter>
    receiver>
    
    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 应用。

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

    在这里插入图片描述

  • 相关阅读:
    初识Spring框架~控制反转IoC、依赖注入DI以及Spring项目的创建方式
    快速解决“找不到msvcr120.dll无法执行代码”问题,总结5解决方法
    [附源码]Python计算机毕业设计Django人事管理系统
    Fiddler抓包原理讲解以及实例操作
    Dubbo3应用开发—Dubbo注册中心引言
    vue+element实现多级表头加树结构
    【全开源】多功能投票小程序源码(Uniapp+ThinkPHP+FastAdmin)
    ciscoRV110W(强网杯2020)
    嵌入式软件架构设计-消息交互
    Linux网络编程系列之网络编程基础
  • 原文地址:https://blog.csdn.net/rjdeng/article/details/139323944