广播有延迟

2024-01-23

我们使用广播来传达远程服务和 UI 之间的状态更改。这样做时,我们发现了一个非常奇怪的行为:有时(我找不到任何线索为什么)这些广播会延迟 8 秒左右。

我们如何发送它们(非常基本,mState只是一个枚举)(服务中的远程进程):

Intent intent = new Intent();
intent.setAction(ACTION_STATE_CHANGED);
intent.putExtra(EXTRA_STATE, mState);

Service.get().sendBroadcast(intent, null);

静态接收器如何注册(App):

<receiver android:name=".ServiceStateReceiver">
    <intent-filter>
        <action android:name="service.intent.action.STATE_CHANGE" />
    </intent-filter>
</receiver>

接收器类(App):

public class ServiceStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v("State", "State via static received");
    }
}

现在有时会延迟(总是针对相同的州)

状态枚举:

public enum State {
    DISCONNECTED,
    BT_DISABLED,
    BT_SCANNING,
    BT_TIMEOUT,
    BT_FAILURE,
    BT_LOCATION_NEEDED,
    CONNECTING,
    ACTIVATION_FAILURE,
    VIN_NEEDED,
    CAR_MODEL_NEEDED,
    MILEAGE_NEEDED,
    READY,
    IGNITION_OFF,
    IGNITION_ON;

    @Override
    public String toString() {
        return name();
    }
}

现在出现了奇怪的部分:如果我注册一个动态接收器,我们总是立即在那里接收所有广播。静态的仍然有很大的延迟。如果我通过发送广播sendOrderedBroadcast两者(静态和动态)都有这种延迟。

动态接收器:

registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.i("State", "State via dynamic received");
            }
        }, new IntentFilter(State.ACTION_STATE_CHANGED));

到目前为止我尝试过的:

  • 从主线程/工作线程发送广播(没有改变)
  • 使用权限属性(没有改变)
  • 连续多次发送广播(不改变任何内容,现在只是获得多个延迟广播)

另外: logcat 没有似乎相关的输出。在不同的设备上尝试(OnePlus 3 7.1.1、Z3 6.0.1、S7 Edge 7.1.1),均显示相同的行为

我认为这可能是相关的:Android网络状态变化检测需要时间 https://stackoverflow.com/questions/25305698/android-network-state-change-detection-takes-time


经过几个小时的寻找答案后,我找到了?发布此后的解决方案。

似乎添加了FLAG_RECEIVER_FOREGROUND标记到意图完全消除了这种延迟。仍然很高兴知道为什么会发生这种情况,以及这是否是一个很好的“修复”,或者我是否用它破坏了其他东西。

这可以解决问题:

    intent.setFlags(FLAG_RECEIVER_FOREGROUND);

如果设置,当发送广播时,允许接收者运行 前台优先,超时间隔较短。正常期间 广播接收器不会自动吊出 背景优先级。

来源:https://developer.android.com/reference/android/content/Intent.html#FLAG_RECEIVER_FOREGROUND https://developer.android.com/reference/android/content/Intent.html#FLAG_RECEIVER_FOREGROUND

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

广播有延迟 的相关文章

随机推荐