Android之粘性廣播理解

來源:互聯網
上載者:User

原文:http://blog.csdn.net/weidi1989/article/details/8016688

BroadcastReceiver,作為一個廣播接收者,因為android組件之間訊息的傳遞基於intent,所以廣播接收者想要接收什麼類型的廣播,將receiver標籤下的intent-filter標籤下的action標籤的值置為那個廣播類型即可,如

  1. <receiver android:name=".IncomingSMSReceiver">  
  2.      <intent-filter>  
  3.           <action android:name="android.intent.action.BOOT_COMPLETED"/>  
  4.           <action android:name="android.provider.Telephony.SMS_RECEIVED"/>  
  5.      </intent-filter>  
  6. </receiver>  


上面這段代碼其實就註冊了兩個廣播接收的類型,系統開機啟動完成時的廣播和簡訊到來的廣播(注意加上簡訊接受許可權)都會被接收到,然後可以再onReceive()方法裡面寫上你想寫的代碼了。
額外提個事,許可權問題一定要加上,現在的logcat裡面Permission denied的提示都不是紅色的了,改成橙色的,我還以為我這沒出問題,找了半天代碼的問題,結果後來還是發現許可權配錯了,本來想攔截撥出的電話的,結果沒配許可權怎麼都拿不到資料啊,找了十幾分鐘。雖然相對前些天我找一個上午的許可權問題進步多了,但是我還是這麼認為,玩android許可權問題都要找個十來分鐘的話那就太2了。
除了在資訊清單檔中配置以外,也可以在代碼中訂閱
        

  1. IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");  
  2. Receiver receiver = new Receiver();  
  3. registerReceiver(receiver, filter);  


Receiver是你自己寫的繼承自BroadcastReceiver的類。IntentFilter就對應著Action啦。
還有一個細節是sendBroadcast的三種發送方法。
sendBroadcast(),sendOrderedBroadcast()和sendStickyBroadcast()

sendBroadcast()這個方法的廣播是能夠發送給所有廣播接收者,按照註冊的先後順序,如果你這個時候設定了廣播接收者的優先順序,優先順序如果恰好與註冊順序相同,則不會有任何問題,如果順序不一樣,會出leaked IntentReceiver 這樣的異常,並且在前面的廣播接收者不能調用abortBroadcast()方法將其終止,如果調用會出BroadcastReceiver trying to
return result during a non-ordered broadcast的異常,當然,先接收到廣播的receiver可以修改廣播資料。

sendOrderedBroadcast()方法顧名思義就是priority的屬效能起作用,並且在隊列前面的receiver可以隨時終止廣播的發送。還有這個api能指定final的receiver,這個receiver是最後一個接收廣播時間的receiver,並且一定會接收到廣播事件,是不能被前面的receiver攔截的。實際做實驗的情況是這樣的,假設我有3個receiver依序排列,並且sendOrderedBroadcast()方法指定了一個finalReceiver,那麼intent傳遞給這4個Receiver的順序為Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。這個特性可以用來統計系統中能監聽某種廣播的Receiver的數目。

sendStickyBroadcast()字面意思是發送粘性的廣播,使用這個api需要許可權android.Manifest.permission.BROADCAST_STICKY,粘性廣播的特點是Intent會一直保留到廣播事件結束,而這種廣播也沒有所謂的10秒限制,10秒限制是指普通的廣播如果onReceive方法執行時間太長,超過10秒的時候系統會將這個廣播置為可以幹掉的candidate,一旦系統資源不夠的時候,就會幹掉這個廣播而讓它不執行。
下面是廣播接收者的生命週期以及一些細節部分:
1.廣播接收者的生命週期是非常短暫的,在接收到廣播的時候建立,onReceive()方法結束之後銷毀
2.廣播接收者中不要做一些耗時的工作,否則會彈出Application No Response錯誤對話方塊
3.最好也不要在廣播接收者中建立子線程做耗時的工作,因為廣播接收者被銷毀後進程就成為了空進程,很容易被系統殺掉
4.耗時的較長的工作最好放在服務中完成
至於廣播接收者接收使用者的簡訊,實現ip撥號等功能,明白上面的話實現起來就輕而易舉了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.