这是Android四大组件之广播接收器BroadcastReceiver的跨App通信案例,用两个独立项目演示:App1发送自定义广播,App2接收这个广播
1. 核心概念
Android广播是一种系统级的消息发布/订阅机制:
- 广播可以跨应用发送、接收;既可以接收自定义广播,也可以接收系统广播(如开机、电量变化、屏幕锁屏)
- 测试方案:新建2个独立Android项目
- SendDemo:发送自定义广播的发送方App
- SendDemo2:接收广播的接收方App(截图里这个项目)
2. 接收方代码(SendDemo2)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCastService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 收到广播触发回调,弹出Toast提示
Toast.makeText(context, "接收到我们自定义的广播22222", Toast.LENGTH_LONG).show();
}
}
Code language: JavaScript (javascript)
- 必须继承
BroadcastReceiver,重写onReceive(),收到广播时自动执行这个方法 - 注意:
onReceive中不能做耗时操作,广播生命周期很短
3. 注册广播接收器(两种方式)
方式1:静态注册(在AndroidManifest.xml注册,App未启动也能接收,Android8.0之后有限制)
<receiver android:name=".MyBroadCastService">
<intent-filter>
<!-- 动作标识,发送方要使用完全一样的action字符串 -->
<action android:name="com.foxdevelop.MY_CUSTOM_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
发送方SendDemo发送广播时,Intent的action必须写
com.foxdevelop.MY_CUSTOM_BROADCAST,两边action一致才能收到
方式2:动态注册(代码注册,App运行状态才可以接收)
MyBroadCastService receiver = new MyBroadCastService();
IntentFilter filter = new IntentFilter("com.foxdevelop.MY_CUSTOM_BROADCAST");
registerReceiver(receiver, filter);
Code language: JavaScript (javascript)
4. 发送方 SendDemo 发送广播代码
// 发送自定义跨应用广播
Intent intent = new Intent("com.foxdevelop.MY_CUSTOM_BROADCAST");
sendBroadcast(intent);
Code language: JavaScript (javascript)
5. 注意
- Android 8.0(API26) 之后:静态注册的自定义隐式广播会被限制,很多自定义action静态注册收不到广播
- 解决办法:①动态注册;②发送广播时带上包名,使用显式Intent
- 系统广播(网络变化、电量)大部分依然可以正常接收,部分系统广播也有限制
- 跨应用广播存在安全风险,可以设置权限控制广播的收发
6. 运行流程
- 安装 SendDemo(发送端)、SendDemo2(接收端)两个App到同一个手机/模拟器
- SendDemo点击按钮,调用
sendBroadcast发送action为com.foxdevelop.MY_CUSTOM_BROADCAST的广播 - 系统分发这条广播,所有注册了这个action的BroadcastReceiver(SendDemo2里的MyBroadCastService)触发onReceive
- SendDemo2弹出Toast:
接收到我们自定义的广播22222