2017-06-13 93 views
9

我们使用广播来传达远程服务和我们的用户界面之间的状态变化。这样做,我们发现了一个非常奇怪的行为:有时(我找不到任何线索为什么)这些广播延迟了大约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输出。尝试在不同的设备(万普拉斯3 7.1.1,6.0.1 Z3,S7边缘7.1.1),都显示相同的行为

我认为这可能与:Android network state change detection takes time

+1

还有一个问题,在Android的问题跟踪它:https://issuetracker.google.com/issues/62298626 – noongiya95

回答

2

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

看来,将FLAG_RECEIVER_FOREGROUND标志添加到intent中可以完全消除此延迟。如果知道为什么会发生这种情况,并且如果这是一个很好的“修复”,或者如果我用这个来破坏其他东西,我们仍然会很高兴。

该做的伎俩:

intent.setFlags(FLAG_RECEIVER_FOREGROUND); 

如果设置,发送广播接收者被允许在 前景优先级运行,用较短的超时间隔时。在正常的 广播中,接收器不会自动挂出 后台优先级。

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