程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> BroadcastReceive廣播接收器:

BroadcastReceive廣播接收器:

編輯:C++入門知識

BroadcastReceive廣播接收器:


BroadcastReceive廣播接收器:
public class Test extends Activity{  
    private final String ACTION_NAME = "發送廣播";  
    private Button mBtnMsgEvent = null;  
      
    protected void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  
          
        //注冊廣播  
        registerBoradcastReceiver();  
          
        LinearLayout mLinearLayout = new LinearLayout(this);  
        mBtnMsgEvent = new Button(this);  
        mBtnMsgEvent.setText("發送廣播");  
        mLinearLayout.addView(mBtnMsgEvent);  
        setContentView(mLinearLayout);  
          
        mBtnMsgEvent.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent mIntent = new Intent(ACTION_NAME);  
                mIntent.putExtra("yaner", "發送廣播,相當於在這裡傳送數據");  
                  
                //發送廣播  
                sendBroadcast(mIntent);  
            }  
        });  
    }  
      
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver(){  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            String action = intent.getAction();  
            if(action.equals(ACTION_NAME)){  
                Toast.makeText(Test.this, "處理action名字相對應的廣播", 200);  
            }  
        }  
          
    };  
      
    public void registerBoradcastReceiver(){  
        IntentFilter myIntentFilter = new IntentFilter();  
        myIntentFilter.addAction(ACTION_NAME);  
        //注冊廣播        
        registerReceiver(mBroadcastReceiver, myIntentFilter);  
    }  
}  
//切記關閉廣播
protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  unregisterReceiver(receiver);
 }
你的應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager 來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。
廣播類型:
普通廣播,通過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後,廣播依然存在,直到你調用removeStickyBroadcast(intent)主動把它去掉
注意:發送廣播時的intent參數與Contex.startActivity()啟動起來的Intent不同,前者可以被多個訂閱它的廣播接收器調用,後者只能被一個(Activity或service)調用
監聽廣播Intent步驟:
1>             寫一個繼承BroadCastReceiver的類,重寫onReceive()方法,廣播接收器僅在它執行這個方法時處於活躍狀態。當onReceive()返回後,它即為失活狀態,注意:為了保證用戶交互過程的流暢,一些費時的操作要放到線程裡,如類名SMSBroadcastReceiver
2>            注冊該廣播接收者,注冊有兩種方法程序動態注冊和AndroidManifest文件中進行靜態注冊(可理解為系統中注冊)如下:
        靜態注冊,注冊的廣播,下面的priority表示接收廣播的級別"2147483647"為最高優先級

動態注冊,一般在Activity可交互時onResume()內注冊BroadcastReceiver
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mBatteryInfoReceiver ,intentFilter);

//反注冊
unregisterReceiver(receiver);
注意:
1.生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報ANR(Application No Response) 程序無響應的錯誤信息,如果需要完成一項比較耗時的工作 , 應該通過發送 Intent 給 Service, 由Service 來完成 . 這裡不能使用子線程來解決 , 因為 BroadcastReceiver 的生命周期很短 , 子線程可能還沒有結束BroadcastReceiver 就先結束了 .BroadcastReceiver 一旦結束 , 此時 BroadcastReceiver 的所在進程很容易在系統需要內存時被優先殺死 , 因為它屬於空進程 ( 沒有任何活動組件的進程 ). 如果它的宿主進程被殺死 , 那麼正在工作的子線程也會被殺死 . 所以采用子線程來解決是不可靠的
2. 動態注冊廣播接收器還有一個特點,就是當用來注冊的Activity關掉後,廣播也就失效了。靜態注冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用
系統常見廣播Intent,如開機啟動、電池電量變化、時間改變等廣播

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved