BroadCast 廣播用于程式間的接收、過濾、并處理資訊。同時,廣播實作方式分為靜态廣播和動态廣播
靜态廣播:需要在manifest中注冊實作。
廣播端,繼承BroadcastReceiver 重寫onReceive()方法處理接收的資訊
public class MyBroadCast extends BroadcastReceiver {
public static final String MY_SMS_BROADCAST = "com.example.broadcast.sms";//自定義廣播标記實作,通過此來發送廣播
public static final String SYSTEM_SMS_BROADCAST = "android.provider.Telephony.SMS_RECEIVED"; //系統定義字元标記
@Override
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if (action.equals(MY_SMS_BROADCAST)) { //實作過濾
<span style="white-space:pre"> </span>//接收處理資訊
Toast.makeText(arg0, "處理自定義短信廣播", Toast.LENGTH_SHORT).show();
}else if (action.equals(SYSTEM_SMS_BROADCAST)) {
<pre name="code" class="html"><span style="white-space:pre"> </span>//接收處理資訊
Toast.makeText(arg0, "處理系統接收短信", Toast.LENGTH_SHORT).show();}}}
發送資訊端, 此處采用按鈕點選發送(activity端)
mSMSBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MyBroadCast.MY_SMS_BROADCAST); //将消息發送到标記端
sendBroadcast(intent);
}
});
在manifest中的注冊
<receiver android:name="com.example.broadcast.MyBroadCast">
<intent-filter>
<!-- 自定義注冊過濾 -->
<action android:name="com.example.broadcast.sms"></action>
<!-- 系統接收短信過濾 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
同時此處運用手機系統所有的功能時應加上權限,此處用到系統短信接收,應加上接收權限
<!-- 廣播接收處理短信權限 -->
<uses-permission android:name = "android.permission.RECEIVE_SMS" />
做到此處,廣播的靜态實作方式就可以實作了。
但此時還應該注意一個問題:在我們處理資訊時在onReceive()方法中不能過久的處理資訊,超過10秒左右的耗時操作就會報錯(因為廣播的生命周期為10秒左右)。
廣播的分類:1、普通廣播(無序廣播) (Normal broadcasts)、大多數情況下使用的
2、有序廣播 (Ordered broadcasts)、廣播依次發送,有權限問題,看了一下網上大多數情況下說的是權限在-1000到1000之間,數值越大,優先級越高,擷取資訊者可以更改和删除資訊,但我也看到有說最大數值為integer 的最大值,即 2147483647,這個數值我也沒有試過,如果用到的時候可以試一下。此方法在靜态廣播中實作
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
3、異步廣播(粘性消息)
動态廣播:在代碼中注冊實作
public class DynamicBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("com.example.broadcast")) { //當有多個标志時起作用,此處可省略
//處理資訊
}
}
}
public void reciverBroadCast(){
receiver = new DynamicBroadCast();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.broadcast"); //過濾标志
registerReceiver(receiver, filter); //動态注冊
}
注冊時建議在onResume()中注冊(與activity生命周期綁定)
@Override
protected void onResume() {
super.onResume();
reciverBroadCast();//注冊
}
取消時建議在onPause()中
@Override
protected void onPause() {
super.onPause();
if (receiver !=null) {
unregisterReceiver(receiver); //取消注冊
}
}
在與service生命周期綁定時為oncreat()和ondestroy()中