在 Android 6.0(API 23)及以上,应用需要在运行时请求权限。BroadcastReceiver 可以用来监听权限变化,并在权限授予或拒绝后采取相应的措施。
请求权限:
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>
通过广播机制可以实现应用内的通知更新,例如某个模块发生了数据更新,需要通知其他模块进行相应的操作。
发送广播通知:
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();
}
};
公共广播可能会被恶意应用利用进行广播攻击,导致安全问题。为广播接收器设置合适的权限可以有效防止此类攻击。
发送广播时设置权限:
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>
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();
}
};
在组件的生命周期中合理注册和取消注册广播接收器,避免内存泄漏和资源浪费。
@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) {
// 处理接收到的广播
}
};
广播机制在 Android 中是一个非常灵活和强大的组件通信方式,适用于多种应用场景。通过系统广播、自定义广播、有序广播和本地广播,可以实现多样化的通信需求。在实际应用中,开发者需要结合具体需求,选择合适的广播机制,并通过优化策略提升应用的性能和安全性。
通过合理运用广播机制及其优化策略,开发者可以有效提升应用的可维护性、稳定性和安全性,从而构建高质量的 Android 应用。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |