gpt4 book ai didi

android - 广播延迟

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:11:38 24 4
gpt4 key购买 nike

我们使用广播来传达远程服务和我们的 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 network state change detection takes time

最佳答案

在搜索了几个小时的答案后,我找到了?发布后的解决方案。

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

这就是诀窍:

    intent.setFlags(FLAG_RECEIVER_FOREGROUND);

If set, when sending a broadcast the recipient is allowed to run at foreground priority, with a shorter timeout interval. During normal broadcasts the receivers are not automatically hoisted out of the background priority class.

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

关于android - 广播延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com