IT评测·应用市场-qidao123.com

标题: 深入分析 Android BroadcastReceiver (七) [打印本页]

作者: 张国伟    时间: 2024-7-11 05:11
标题: 深入分析 Android BroadcastReceiver (七)
深入分析 Android BroadcastReceiver (七)

1. 高级应用场景

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

请求权限:
  1. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
复制代码
处置惩罚权限请求结果:
  1. @Override
  2. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  3.     super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  4.     if (requestCode == REQUEST_CAMERA_PERMISSION) {
  5.         if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  6.             // 权限授予,发送广播
  7.             Intent intent = new Intent("com.example.PERMISSION_GRANTED");
  8.             sendBroadcast(intent);
  9.         } else {
  10.             // 权限被拒绝
  11.             Toast.makeText(this, "Camera permission denied", Toast.LENGTH_SHORT).show();
  12.         }
  13.     }
  14. }
复制代码
监听权限变化的广播接收器:
  1. public class PermissionReceiver extends BroadcastReceiver {
  2.     @Override
  3.     public void onReceive(Context context, Intent intent) {
  4.         if ("com.example.PERMISSION_GRANTED".equals(intent.getAction())) {
  5.             // 处理权限授予后的操作
  6.             Toast.makeText(context, "Camera permission granted", Toast.LENGTH_SHORT).show();
  7.         }
  8.     }
  9. }
  10. // 在 Manifest 文件中声明接收器
  11. <receiver android:name=".PermissionReceiver">
  12.     <intent-filter>
  13.         <action android:name="com.example.PERMISSION_GRANTED"/>
  14.     </intent-filter>
  15. </receiver>
复制代码
通过广播机制可以实现应用内的关照更新,比方某个模块发生了数据更新,必要关照其他模块举行相应的操作。
1.2 示例:应用内关照更新

发送广播关照:
  1. Intent intent = new Intent("com.example.DATA_UPDATED");
  2. intent.putExtra("data", "New data available");
  3. LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
复制代码
接收广播关照:
  1. @Override
  2. protected void onStart() {
  3.     super.onStart();
  4.     IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");
  5.     LocalBroadcastManager.getInstance(this).registerReceiver(dataUpdateReceiver, filter);
  6. }
  7. @Override
  8. protected void onStop() {
  9.     super.onStop();
  10.     LocalBroadcastManager.getInstance(this).unregisterReceiver(dataUpdateReceiver);
  11. }
  12. private final BroadcastReceiver dataUpdateReceiver = new BroadcastReceiver() {
  13.     @Override
  14.     public void onReceive(Context context, Intent intent) {
  15.         String data = intent.getStringExtra("data");
  16.         // 处理数据更新
  17.         Toast.makeText(context, "Data updated: " + data, Toast.LENGTH_SHORT).show();
  18.     }
  19. };
复制代码
2. 安全性与性能优化

公共广播大概会被恶意应用利用举行广播攻击,导致安全标题。为广播接收器设置符合的权限可以有效防止此类攻击。
2.1 示例:设置权限防止广播攻击

发送广播时设置权限:
  1. Intent intent = new Intent("com.example.SECURE_ACTION");
  2. sendBroadcast(intent, "com.example.MY_PERMISSION");
复制代码
接收器声明权限:
  1. <receiver android:name=".SecureReceiver" android:permission="com.example.MY_PERMISSION">
  2.     <intent-filter>
  3.         <action android:name="com.example.SECURE_ACTION"/>
  4.     </intent-filter>
  5. </receiver>
复制代码
LocalBroadcastManager 仅在应用内部举行广播通信,具有更高的安全性和效率。
2.2 示例:使用 LocalBroadcastManager

发送本地广播:
  1. LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
  2. Intent intent = new Intent("com.example.LOCAL_EVENT");
  3. localBroadcastManager.sendBroadcast(intent);
复制代码
接收本地广播:
  1. @Override
  2. protected void onStart() {
  3.     super.onStart();
  4.     IntentFilter filter = new IntentFilter("com.example.LOCAL_EVENT");
  5.     LocalBroadcastManager.getInstance(this).registerReceiver(localEventReceiver, filter);
  6. }
  7. @Override
  8. protected void onStop() {
  9.     super.onStop();
  10.     LocalBroadcastManager.getInstance(this).unregisterReceiver(localEventReceiver);
  11. }
  12. private final BroadcastReceiver localEventReceiver = new BroadcastReceiver() {
  13.     @Override
  14.     public void onReceive(Context context, Intent intent) {
  15.         // 处理本地事件
  16.         Toast.makeText(context, "Local event received", Toast.LENGTH_SHORT).show();
  17.     }
  18. };
复制代码
在组件的生命周期中合理注册和取消注册广播接收器,避免内存泄漏和资源浪费。
2.3 示例:在生命周期中注册和取消注册广播接收器

  1. @Override
  2. protected void onStart() {
  3.     super.onStart();
  4.     IntentFilter filter = new IntentFilter("com.example.SOME_ACTION");
  5.     registerReceiver(someReceiver, filter);
  6. }
  7. @Override
  8. protected void onStop() {
  9.     super.onStop();
  10.     unregisterReceiver(someReceiver);
  11. }
  12. private final BroadcastReceiver someReceiver = new BroadcastReceiver() {
  13.     @Override
  14.     public void onReceive(Context context, Intent intent) {
  15.         // 处理接收到的广播
  16.     }
  17. };
复制代码
3. 总结

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

通过合理运用广播机制及其优化策略,开发者可以有效提拔应用的可维护性、稳定性和安全性,从而构建高质量的 Android 应用。
接待点赞|关注|收藏|评论,您的肯定是我创作的动力


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




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4