天天看点

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

继续阅读