1、android的廣播分爲:廣播發送者和廣播接收者。廣播就是一個全局監聽器,用於監聽系統全局的廣播消息。只有繼承到Broadcast的類才能捕捉到系統發出的廣播消息。讓後你想幹嘛就幹嘛唄。O(∩_∩)O
2、android中可以用到廣播的地方: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 2016年3月30日
*/
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 2016年3月30日
*/
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
缺點:效率低。
優先接收到Broadcast的Receiver可通過setResultExtras(Bundle)方法將處
理結果存入Broadcast中。
粘性廣播:主要是爲了解決,在發送完廣播之後,動態註冊的接收者,也能夠收
到廣播。
列如:先發送一個廣播,我的接收者是通過程序中的某個按鈕動態
註冊的,如果不是粘性廣播,我註冊完接收者肯定無法收到
廣播了,要是通過發送粘性廣播就能夠在我動態註冊完接收
者後也能收到廣播。
添加權限<uses-permissionandroid:nnaem="android.permission.BROADCAST_STICKY"/>
生命週期:廣播接收者的生命週期是非常短的,在接收到廣播的 時候創建,onReceiver()方法
結束之後銷燬。
注意:廣播接收器的執行和activity以及service的執行一樣都是由Android的Main主線程負責的。
所以爲了避免對主線程的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
注意屏幕喚醒和休眠廣播只能在代碼中註冊,在清單文件中將不起作用