廣播的學習初學者

1android的廣播分爲:廣播發送者和廣播接收者。廣播就是一個全局監聽器,用於監聽系統全局的廣播消息。只有繼承到Broadcast的類才能捕捉到系統發出的廣播消息。讓後你想幹嘛就幹嘛唄。O(_)O

 

2android中可以用到廣播的地方:1.同一app內部的同一組件內的消息通信(單個或多個線程)

       2.同一app內部的不同組件之間的消息通信(單個進程)

       3. 同一app具有多個進程的不同組件之間的消息通信

       4. 不同app組件之間的消息通信

       5.android系統在特定情況下與app之間的消息通信

 

3、創建廣播發送者  代碼:

importandroid.app.Activity;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.Toast;

/**

 * 廣播發送者

 * @author rou

 * @date 2016330

 */

public classMainActivity extends Activity {

privateButton button;

privateOnClickListener Listener = new OnClickListener() {

@Override

publicvoid onClick(View arg0) {

Intentintent = new Intent();

intent.setAction("com.love");//指定廣播的頻率

intent.putExtra("name","xiaorou");//指定廣播發送出去的消息

MainActivity.this.sendBroadcast(intent);//發送廣播

Toast.makeText(getApplicationContext(), "發送廣播成功",1).show();

}

};

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button= (Button) findViewById(R.id.button);

button.setOnClickListener(Listener);

}

}

 

4、創建廣播接收者 代碼:

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

/**

 * 自定義廣播接收者

 * @author rou

 * @date 2016330

 */

public classMyBroadcastReciver extends BroadcastReceiver{

@Override

publicvoid onReceive(Context context, Intent intent) {

Stringname = intent.getExtras().getString("name");

System.out.println("接受到"+name);

}

}

 

AndroidManifest.xml:

  <!-- 註冊廣播接收(靜態) -->

        <receiverandroid:name="com.myandroidexerciseone.MyBroadcastReciver">  name:的值爲類的全路徑

            <intent-filter>

                <actionandroid:name="com.love"/>  相當於是指定接收的廣播的頻率

            </intent-filter>

        </receiver>

 

5、註冊廣播接收者: 靜態註冊:如上,在安卓清單文件中註冊。

動態註冊: 在應用程序被啓動時執行註冊,相對應的在應用程序退出時,必

                        須要取消註冊。註冊:context.registerReceiver(receiver,filter);

                                              取消註冊:context.unregisterReceiver(reciever);

動態註冊:

代碼:oncreate 方法裏: 1.實列化一個過濾器

              IntentFilterintentFilter = new IntentFilter();

              2.添加過濾的Action

             intentFilter.addAction(Intent.Action_AIRPLANE_MODE_CHANGED);

             3.實例化廣播監聽

             NetChangReceivernetChangReceiver = new NetChangReceiver();

             4.將廣播監聽器和過濾器註冊在一起

             registerReceiver(netChangReceiver,intentFilter);

           onDestory方法裏:銷燬activity時取消註冊廣播監聽

                                              unregisterReceiver(netChangReceiver);

 

6、廣播的分類: 有序廣播:普通廣播不能中斷,所有監聽這個廣播的都能收到信息。而有序廣播

             可以中斷。 中斷廣播的傳播:abortBroadcast();

              優點:按優先級的不同,優先Receiver可對數據進行處理,並傳遞給                 

                           下一個Receiver。設置優先級,在<intent-filter>節點中添加

                            android:priority屬性 ,取值範圍:-1000~~1000

              缺點:效率低。

             優先接收到BroadcastReceiver可通過setResultExtras(Bundle)方法將處           

             理結果存入Broadcast中。

  粘性廣播:主要是爲了解決,在發送完廣播之後,動態註冊的接收者,也能夠收

                        到廣播。

                         列如:先發送一個廣播,我的接收者是通過程序中的某個按鈕動態

                                        註冊的,如果不是粘性廣播,我註冊完接收者肯定無法收到

                                        廣播了,要是通過發送粘性廣播就能夠在我動態註冊完接收

                                        者後也能收到廣播。

                           添加權限<uses-permissionandroid:nnaem="android.permission.BROADCAST_STICKY"/>

生命週期:廣播接收者的生命週期是非常短的,在接收到廣播的 時候創建,onReceiver()方法

                      結束之後銷燬。

注意:廣播接收器的執行和activity以及service的執行一樣都是由AndroidMain主線程負責的。

             所以爲了避免對主線程的UI繪製工作產生嚴重的干擾,廣播的onReceive方法中不能做

             非常複雜的操作。因爲這個方法的執行時間被限定到了10秒之內。否則就會報ANR異常。

 

7、系統廣播:

      開機啓動android.intent.action.BOOT_COMPLETED

                權限:<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

                android4.0無效,如果需要監聽開機廣播需要把應用升級爲系統應用。

    SD卡加載已完成Intent.ACTION_MEDIA_MOUNTED

    收到短信android.provider.Telephony.SMS_RECEIVED

            權限:<uses-permissionandroid:name="android.permission.RECEIVE_SMS"/>

            獲取短信內容:Object[]objArray=(Object[])bundle.get("pdus");構建短信對象array

                          SmsMessage[] messages= new SmsMessage[objArray.length];根據收到的對象長度創建array長度

                         for(int i=0;i<objArray.length;i++){

                             messages[i]=SmsMessage.createFromPdu((byte[])objArray[i]);                          

   }把每一個單元的pdu格式的短信轉換成SmsMessage對象

       for(SmsMessage s:sms){

      String msg =s.getDisplayMessageBody();

      String source =s.getDisplayOriginatingAddress();

   }獲取短信的內容和對方的手機號碼

    來電android.intent.action.PHOTO_STATE

權限:android.permission.READ_PHONE_STATE

獲取電話管理服務,獲得電話狀態:TelephonyManager tm =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

獲取來電號碼:intent.getStringExtra("incoming_number");

int state =tm.getCallState();來電三種狀態:響鈴 TelephonyManager.CAll_STATE_RINGING

  接聽 TelephonyManager.CALL_STATE_OFFHOOK

    掛斷 TelephonyManager.CALL_STATE_IDLE

      去電android.intent.action.NEW_OUTGOING_CALL

  權限:android.permission.PROCESS_OUTGOING_CALLS

       android.permission.CALL_PHOTO

 得到去電話的號碼:String phone = intent.getStringExtra(Intent.EXTRA_PHTOT_NUMBER);

 屏幕休眠:休眠:intent.ACTION_SCREEN_ON

              喚醒:Intent.ACTION_SCREEN_OFF

          注意屏幕喚醒和休眠廣播只能在代碼中註冊,在清單文件中將不起作用

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章