2017-06-13 149 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