如何在Android Studio中实现简单的Broadcast Receiver?
嘿,正在练BroadcastReceiver是吧?这可是Android组件里很实用的一块!我看到你贴的Manifest代码里<intent-filter>没写完,结合入门练习的常见场景,我来帮你把整个流程理清楚,从配置到代码实现再到注意事项都给你说清楚~
完整的Manifest配置示例
先把你的Manifest代码补全并格式化,这里以监听屏幕亮灭广播为例(非常适合入门练手):
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.maurelio.flipcover"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 静态注册BroadcastReceiver --> <receiver android:name=".SensorReceiver"> <intent-filter> <!-- 监听屏幕点亮系统广播 --> <action android:name="android.intent.action.SCREEN_ON" /> <!-- 监听屏幕熄灭系统广播 --> <action android:name="android.intent.action.SCREEN_OFF" /> </intent-filter> </receiver> </application> </manifest>
SensorReceiver核心代码实现
接下来创建SensorReceiver类,继承自BroadcastReceiver,实现核心的onReceive方法来处理广播事件:
public class SensorReceiver extends BroadcastReceiver { private static final String TAG = "SensorReceiver"; @Override public void onReceive(Context context, Intent intent) { if (intent == null || intent.getAction() == null) { return; } switch (intent.getAction()) { case Intent.ACTION_SCREEN_ON: Log.d(TAG, "屏幕点亮啦!"); // 这里可以加你自己的逻辑,比如弹个提示、触发某个服务 Toast.makeText(context, "屏幕已点亮", Toast.LENGTH_SHORT).show(); break; case Intent.ACTION_SCREEN_OFF: Log.d(TAG, "屏幕熄灭啦!"); Toast.makeText(context, "屏幕已熄灭", Toast.LENGTH_SHORT).show(); break; default: Log.d(TAG, "收到未知广播:" + intent.getAction()); } } }
必看的关键注意事项
- Android 8.0+的静态注册限制:从API 26开始,Google收紧了静态注册广播的权限,大部分系统广播(比如上面的屏幕亮灭)都不能用静态注册了,必须改用动态注册。给你贴个动态注册的示例,一般放在Activity里:
private SensorReceiver mReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化接收器并设置监听的广播action mReceiver = new SensorReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); // 注册接收器 registerReceiver(mReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 一定要在组件销毁时注销接收器,不然会内存泄漏! if (mReceiver != null) { unregisterReceiver(mReceiver); } }
- 权限声明:如果监听的是需要权限的广播(比如开机广播
BOOT_COMPLETED),得在Manifest里先加权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- 自定义广播练习:如果是自己发自己收的自定义广播,静态注册是完全没问题的。发送广播的代码如下:
// 发送自定义广播 Intent customIntent = new Intent("org.maurelio.flipcover.CUSTOM_ACTION"); sendBroadcast(customIntent);
对应的Manifest里的intent-filter要加上这个自定义action:
<action android:name="org.maurelio.flipcover.CUSTOM_ACTION" />
测试小技巧
- 运行App后,锁屏再亮屏,看Logcat里的
SensorReceiver标签日志,或者有没有弹出Toast提示; - 如果用动态注册,要保证Activity没被销毁(比如不要按返回键退出,切到后台就行),要是需要后台持续监听,可以结合Service来实现。
内容的提问来源于stack exchange,提问作者maurelio79
相关产品推荐
相关产品推荐

