【问题标题】:Broadcasts are delayed广播有延迟
【发布时间】:2017-06-13 08:31:46
【问题描述】:

我们使用广播在远程服务和我们的 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

【问题讨论】:

标签: android android-broadcastreceiver


【解决方案1】:

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

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

这就是诀窍:

    intent.setFlags(FLAG_RECEIVER_FOREGROUND);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2015-12-25
    • 2018-03-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多