1.這幾天在調試Android Ble 與微信藍牙設備通訊,其中遇到一個非常難以理解的問題,就是使用Fragment 時,同一個設備通過廣播發送的數據,我竟然收到3次廣播,o(╥﹏╥)o,情況如下:
I/LeProxy: onCharacteristicChanged() - 45:01:4D:FF:FF:0C uuid=0000fec8-0000-1000-8000-00805f9b34fb
len=20 [FE 01 00 1A 27 11 00 01 0A 00 18 84 80 04 20 01 28 02 3A 06]
I/LeProxy: onCharacteristicChanged() - 45:01:4D:FF:FF:0C uuid=0000fec8-0000-1000-8000-00805f9b34fb
len=6 [45 01 4D FF FF 0C]
D/RightFragment: 接收到廣播 ============================= FE01001A271100010A0018848004200128023A06
D/WxProtocol: 接收長度 = 20, 數據 = FE01001A271100010A0018848004200128023A06
當前接收總長度 = 20
微信協議數據總長度 = 26
D/RightFragment: 接收到廣播 ============================= FE01001A271100010A0018848004200128023A06
D/WxProtocol: 接收長度 = 20, 數據 = FE01001A271100010A0018848004200128023A06
當前接收總長度 = 40
接收錯誤數據 = FE01001A271100010A0018848004200128023A06FE01001A271100010A0018848004200128023A06
D/RightFragment: 接收到廣播 ============================= FE01001A271100010A0018848004200128023A06
D/WxProtocol: 接收長度 = 20, 數據 = FE01001A271100010A0018848004200128023A06
當前接收總長度 = 20
微信協議數據總長度 = 26
D/RightFragment: 接收到廣播 ============================= 45014DFFFF0C
D/WxProtocol: 接收長度 = 6, 數據 = 45014DFFFF0C
當前接收總長度 = 26
接收完整一包完成,開始處理數據
D/WxProtocol: 接收完整一包數據 = FE01001A271100010A0018848004200128023A0645014DFFFF0C
微信協議登錄驗證 = FE01001A271100010A0018848004200128023A0645014DFFFF0C
D/RightFragment: 微信協議發送 = FE0100124E2100010A06080012024F4B1200
D/AndroidRuntime: Shutting down VM
2. 後來發現,出現問題的原因可能是以下兩種情況:
2.1 創建了多個廣播接收者。
2.2 接收者(同一個)多次註冊。
3. 解決問題的辦法:
3.1 在Activity 和 Fragment 中,廣播接收者的創建與註冊不要在onStart()或者onResume()等這種,會被重複調用的方法中執行。放在onCreate(),確保都是執行一次,這樣子就不會重複註冊同一個廣播接收者。
3.2 對於廣播接收者的使用,無論是在Fragment 還是 Activity 中,registerReceiver 和 unregisterReceiver, 一定要配對使用。