我們使用廣播來傳達遠程服務和我們的用戶界面之間的狀態變化。這樣做,我們發現了一個非常奇怪的行爲:有時(我找不到任何線索爲什麼)這些廣播延遲了大約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
還有一個問題,在Android的問題跟蹤它:https://issuetracker.google.com/issues/62298626 – noongiya95