天天看點

BroadcastReceiver廣播傳遞資訊

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()中

繼續閱讀