編輯:關於Android編程
BroardcastReceiver簡介
廣播接收者(BroadcastReceiver)是Android的四大組件之一,用於接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。
廣播是一種廣泛運用的在應用程序之間傳輸信息的機制。而BroadcastReceiver是對發送出來的廣播進行過濾接收並響應的一類組件。你的應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。
BroadcastReceiver自身並不實現圖形用戶界面,但是當它收到某個通知後,BroadcastReceiver可以啟動Activity作為響應,或者通過NotificationMananger提醒用戶,或者啟動Service等等。
BroadcastReceiver使用
監聽廣播Intent步驟:
1、 寫一個繼承BroadCastReceiver的類,重寫onReceive()方法,廣播接收器僅在它執行這個方法時處於活躍狀態。當onReceive()返回後,它即為失活狀態,注意:為了保證用戶交互過程的流暢,一些費時的操作要放到線程裡,如類名SMSBroadcastReceiver
public class SMSBroadcastReceiver extends BroadcastReceiver { // action 名稱 String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ; public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( SMS_RECEIVED )) { // 相關處理 : 地域變換、電量不足、來電來信 } } }
2、注冊該廣播接收者,注冊有兩種方法程序動態注冊和AndroidManifest文件中進行靜態注冊(可理解為系統中注冊)如下,還需聲明權限,下面的priority表示接收廣播的級別:
< receiver android:name = ".SMSBroadcastReceiver" > < intent-filter android:priority = "1000" > < action android:name = " android.provider.Telephony.SMS_RECEIVED" /> intent-filter > receiver > < uses-permission android:name = "android.permission.RECEIVE_SMS" /> < uses-permission android:name = "android.permission.SEND_SMS" />
程序動態注冊,注冊的廣播,下面的priority表示接收廣播的級別"2147483647"為最高優先級
IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " ); registerReceiver(smsBroadcastReceiver , intentFilter);
3、注銷
一句就搞定unregisterReceiver(smsBroadcastReceiver);建議在onPause或者是onDestroy中注銷。
廣播類型有3種類型:
普通廣播,通過Context.sendBroadcast(Intent myIntent)發送的
有序廣播,通過Context.sendOrderedBroadcast(intent, receiverPermission)發送的,該方法第2個參數決定該廣播的級別,級別數值是在 -1000 到 1000 之間 , 值越大 , 發送的優先級越高;廣播接收者接收廣播時的級別級別(可通過intentfilter中的priority進行設置設為2147483647時優先級最高),同級別接收的先後是隨機的, 再到級別低的收到廣播,高級別的或同級別先接收到廣播的可以通過abortBroadcast()方法截斷廣播使其他的接收者無法收到該廣播,還有其他構造函數
異步廣播,通過Context.sendStickyBroadcast(Intent myIntent)發送的,還有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData,
initialExtras)方法,該方法具有有序廣播的特性也有異步廣播的特性;發送異步廣播要:
注意:發送廣播時的intent參數與Contex.startActivity()啟動起來的Intent不同,前者可以被多個訂閱它的廣播接收器調用,後者只能被一個(Activity或service)調用
BroadcastReceiver生命周期
每次廣播到來時,會重新創建BroadcastReceiver對象,並且調用onReceive()方法,執行完以後,該對象即被銷毀.當onReceive()方法在10秒內沒有執行完畢,Android會認為該程序無響應.所以在
BroadcastReceiver裡不能做一些比較耗時的操作,否側會彈出ANR(Application No
Response)的對話框。
如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成.這裡不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束,BroadcastReceiver就先結束了.BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬於空進程(沒有任何活動組件的進程).如果它的宿主進程被殺死,那麼正在工作的子線程也會被殺死.所以采用子線程來解決是不可靠的
(1)兩種方法提沖Spinner中的數據源:通過list集合,或者是通過xml文件進行配置 (2)布局代碼如下: (2) packa
本文實例講述了Android編程實現ImageView圖片拋物線動畫效果的方法。分享給大家供大家參考,具體如下:想實現拋物線動畫,必須知道拋物線的方程,這時候數學其作用了
本文實例講述了Android編程繪制圓形圖片的方法。分享給大家供大家參考,具體如下:效果圖如下:第一步:新建RoundView自定義控件繼承Viewpackage com
先看看效果圖:中間的圓形頭像和光環波形講解請看:http://www.jb51.net/article/96508.htm周圍的氣泡布局,因為布局RatioLayout是