深入分析 Android BroadcastReceiver (七)
文章目录
- 深入分析 Android BroadcastReceiver (七)
- 1. 高级应用场景
- 1.1 示例:动态权限请求
- 1.2 示例:应用内通知更新
- 2. 安全性与性能优化
- 2.1 示例:设置权限防止广播攻击
- 2.2 示例:使用 LocalBroadcastManager
- 2.3 示例:在生命周期中注册和取消注册广播接收器
- 3. 总结
深入分析 Android BroadcastReceiver (七)
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.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. 安全性与性能优化
- 避免广播攻击
公共广播可能会被恶意应用利用进行广播攻击,导致安全问题。为广播接收器设置合适的权限可以有效防止此类攻击。
2.1 示例:设置权限防止广播攻击
发送广播时设置权限:
Intent intent = new Intent("com.example.SECURE_ACTION"); sendBroadcast(intent, "com.example.MY_PERMISSION");接收器声明权限:
- 使用 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(); } };- 合理的生命周期管理
在组件的生命周期中合理注册和取消注册广播接收器,避免内存泄漏和资源浪费。
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 中是一个非常灵活和强大的组件通信方式,适用于多种应用场景。通过系统广播、自定义广播、有序广播和本地广播,可以实现多样化的通信需求。在实际应用中,开发者需要结合具体需求,选择合适的广播机制,并通过优化策略提升应用的性能和安全性。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

