You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android跨应用广播数据接收失败问题求助

跨应用广播接收失败的问题排查与修复

我来帮你梳理一下为什么应用2收不到应用1发送的广播数据,主要有几个关键问题,咱们一步步解决:

核心问题1:应用1发送广播时错误指定了包名

你在应用1里发送ACTION1广播时,调用了i.setPackage("com.test.add");——这个包名是应用1自己的包名,这会导致广播只能被应用1内部的接收器接收,应用2根本接收不到这个广播。

核心问题2:Android 8.0+的隐式广播限制

如果你的应用2的targetSdkVersion >= 26,Android系统会限制静态注册的接收器接收自定义隐式广播,也就是说即使你在应用2的Manifest里注册了接收器,只要应用2的MainActivity没启动(动态注册的接收器未激活),静态接收器也无法收到隐式广播。


具体修复步骤

第一步:修改应用1的广播发送逻辑

根据你的需求选择两种方式:

方式1:发送显式广播(推荐,适用于所有Android版本)

显式广播直接指定应用2的包名和接收器类名,确保广播精准发送到应用2:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.ACTION1);
        i.putExtra("data", "Some data");
        // 替换成应用2的实际包名和接收器全类名
        ComponentName componentName = new ComponentName("com.test.receive", "com.test.receive.MyBroadcastReceiver");
        i.setComponent(componentName);
        sendBroadcast(i);
    }
});

方式2:发送隐式广播(仅适用于Android 7.1及以下,或应用2动态注册接收器处于活跃状态)

直接移除setPackage调用,发送无包名限制的隐式广播:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent i = new Intent(MainActivity.ACTION1);
        i.putExtra("data", "Some data");
        // 移除setPackage调用
        sendBroadcast(i);
    }
});

第二步:优化应用2的接收器配置

场景A:需要在应用2前台时接收广播(动态注册)

确保应用2的MainActivity处于活跃状态(已经打开),动态注册的接收器就能正常工作。你的现有动态注册代码是正确的,但可以添加日志确认注册成功:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = findViewById(R.id.button);
    MyReceiver = new MyBroadcastReceiver();
    IntentFilter intentFilter = new IntentFilter("com.test.add.mystaticevent");
    if(intentFilter != null) {
        registerReceiver(MyReceiver, intentFilter);
        Log.i("MainActivity", "动态接收器注册成功");
    }
}

场景B:需要在应用2后台时也能接收广播(静态注册+显式广播)

如果要在应用2未启动时也能接收广播,必须使用显式广播(对应应用1的方式1),同时确保应用2的Manifest里的接收器配置正确:

<receiver 
    android:name=".MyBroadcastReceiver" 
    android:enabled="true" 
    android:exported="true">
    <intent-filter>
        <action android:name="com.test.add.mystaticevent"/>
    </intent-filter>
</receiver>

(注:android:exported="true"必须设置,允许跨应用调用这个接收器)

第三步:测试验证

  1. 如果用显式广播:先安装应用2,不需要打开应用2,直接点击应用1的发送按钮,应用2的静态接收器就能收到数据并弹出Toast。
  2. 如果用隐式广播:先打开应用2的MainActivity,再点击应用1的发送按钮,应用2的动态接收器会收到数据。

内容的提问来源于stack exchange,提问作者Star

火山引擎 最新活动