You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 14中跨应用Broadcast Receiver重启后失效问题求助

问题:Android 14下Xamarin.Forms应用重启后跨应用广播接收失败

在Android 14设备上运行两个目标API等级为13的Xamarin.Forms应用:

  • 应用1发送自定义广播,应用2负责接收
  • 首次安装后双方收发广播正常,但强制关闭应用1并重启后,应用1发送的广播无法被处于后台的应用2接收

现有代码

应用2的MainActivity代码

protected override async void OnCreate(Bundle savedInstanceState)
{
 IntentFilter intentFilter = new IntentFilter("com.abc.xyz"); 
 RegisterReceiver(_recieverClass, intentFilter);
}

protected override void OnDestroy()
{
 UnRegisterReceiver(_recieverClass);
}

应用2的ReceiverClass代码

[BroadcastReceiver(Enabled = true, Exported = true)]
[IntentFilter(new[] { "com.abc.xyz" })]
public class ReceiverClass : BroadcastReceiver
{
  public override void OnReceive(Context context, Intent intent)
  {
      // 业务逻辑 
  }
}

应用1的广播发送代码

Intent intent = new Intent();
intent.SetAction("com.abc.xyz");
intent.SetFlags(ActivityFlags.FromBackground);
SendBroadcast(intent);

应用2的AndroidManifest声明

<application android:label="@string/app_name" android:allowBackup="false" android:usesCleartextTraffic="false">
    <receiver android:name=".ReceiverClass" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="com.abc.xyz" />
        </intent-filter>
    </receiver>
</application>

问题原因与解决方案

核心原因

  1. 动态接收器生命周期限制:应用2在MainActivity中动态注册的接收器,会在Activity销毁时(应用退后台后可能被系统回收)被注销,此时仅靠静态注册的接收器无法接收隐式广播。
  2. Android 12+隐式广播限制:Android 12及以上版本,后台应用发送的隐式广播,静态注册的接收器默认无法接收,而应用1重启后发送的广播属于此类场景。

解决方案

1. 使用显式广播(推荐)

显式广播直接指定目标接收器的组件信息,绕过隐式广播的限制。修改应用1的发送代码:

Intent intent = new Intent("com.abc.xyz");
// 替换为应用2的实际包名和接收器完整类名
ComponentName targetComponent = new ComponentName("com.your.app2.package", "com.your.app2.package.ReceiverClass");
intent.SetComponent(targetComponent);
// 移除FromBackground标记,显式广播不受该限制影响
SendBroadcast(intent);

2. 移除冗余的动态注册逻辑

应用2已经通过特性和Manifest完成了静态注册,无需再在MainActivity中动态注册,避免因Activity生命周期导致接收器失效。修改应用2的MainActivity:

protected override async void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // 移除动态注册接收器的代码
    // 原有其他业务逻辑保留
}

protected override void OnDestroy()
{
    base.OnDestroy();
    // 移除注销接收器的代码
}

3. 辅助优化(可选)

  • 关闭应用2的电池优化:在设备设置中找到应用2,进入“电池”设置,关闭“优化电池使用”,减少应用被系统后台杀死的概率。
  • 确认接收器的Exported属性:确保静态注册的接收器android:exported="true",允许跨应用调用。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 19:47:46