本文目录导读:
在Android开发中,广播(Broadcast)是一种基于“发布-订阅”模型的跨组件通信机制,它允许应用程序在不同组件(如Activity、Service、BroadcastReceiver)之间传递事件,甚至实现跨应用通信,广播机制是Android系统架构中的重要组成部分,常用于监听系统事件(如网络变化、电量低)、组件间解耦、后台任务触发等场景,本文将全面解析Android广播的类型、原理、实战技巧及优化策略。
广播是一种异步消息传递机制,由BroadcastSender
发送消息,BroadcastReceiver
接收并处理消息,其核心流程如下:
Context.sendBroadcast()
方法发布广播。ActivityManagerService
(AMS)将广播传递给已注册的接收器。onReceive()
方法中处理逻辑。标准广播(Normal Broadcast)
Intent.ACTION_BOOT_COMPLETED
(系统启动完成)。有序广播(Ordered Broadcast)
abortBroadcast()
终止传递。android.provider.Telephony.SMS_RECEIVED
)。<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理逻辑 } }; IntentFilter filter = new IntentFilter("com.example.MY_ACTION"); registerReceiver(receiver, filter); // 需在适当时机调用unregisterReceiver()
onResume()
和onPause()
中)。// 发送标准广播 Intent intent = new Intent("com.example.MY_ACTION"); intent.putExtra("data", "Hello"); sendBroadcast(intent); // 发送有序广播 sendOrderedBroadcast(intent, null);
在<intent-filter>
中设置android:priority
属性(范围:-1000到1000),优先级高的接收器先处理消息:
<intent-filter android:priority="100"> <action android:name="com.example.ORDERED_ACTION"/> </intent-filter>
StickyBroadcast
或LocalBroadcastManager
。LocalBroadcastManager.getInstance(context).sendBroadcast(intent); LocalBroadcastManager.getInstance(context).registerReceiver(receiver, filter);
LiveData
或RxJava
替代。限制广播权限:
<!-- 发送时需声明权限 --> <permission android:name="com.example.PRIVATE_PERMISSION"/> <uses-permission android:name="com.example.PRIVATE_PERMISSION"/> <!-- 接收器声明权限 --> <receiver android:name=".SecureReceiver" android:permission="com.example.PRIVATE_PERMISSION"> <intent-filter>...</intent-filter> </receiver>
避免导出敏感接收器:
设置android:exported="false"
,防止其他应用调用。
onCreate()
中注册但忘记解注册。LocalBroadcastManager
替代全局广播。onReceive()
执行耗时操作:超过10秒可能导致ANR。Context.registerReceiver()
动态注册。public class NetworkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); boolean isConnected = info != null && info.isConnected(); Log.d("Network", "Connected: " + isConnected); } } // 在Activity中注册 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(new NetworkReceiver(), filter);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 使用NetworkCallback替代广播 ConnectivityManager cm = getSystemService(ConnectivityManager.class); cm.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { Log.d("Network", "Connected"); } }); }
Q:广播接收器无法收到消息?
Q:如何避免广播导致的内存泄漏?
onDestroy()
中调用unregisterReceiver()
。Q:Android 10+无法接收开机广播?
RECEIVE_BOOT_COMPLETED
权限,且需用户手动启动应用一次。广播机制在监听系统事件、跨组件通信中仍有不可替代的作用,但其滥用可能导致性能和安全问题,随着Android架构的演进,开发者应结合LiveData
、WorkManager
等现代方案,合理选择工具,以实现高效、安全的应用程序设计。
随着互联网的普及和信息技术的飞速发展台湾vps云服务器邮件,电子邮件已经成为企业和个人日常沟通的重要工具。然而,传统的邮件服务在安全性、稳定性和可扩展性方面存在一定的局限性。为台湾vps云服务器邮件了满足用户对高效、安全、稳定的邮件服务的需求,台湾VPS云服务器邮件服务应运而生。本文将对台湾VPS云服务器邮件服务进行详细介绍,分析其优势和应用案例,并为用户提供如何选择合适的台湾VPS云服务器邮件服务的参考建议。
工作时间:8:00-18:00
电子邮件
1968656499@qq.com
扫码二维码
获取最新动态