android广播功能

本文详细介绍了Android广播机制,包括Broadcast和BroadcastReceiver的概念。Broadcast用于发送广播,BroadcastReceiver负责接收并响应广播。发送广播时,将信息封装在Intent中,通过sendBroadcast等方法发送。BroadcastReceiver在IntentFilter匹配后调用onReceive方法。BroadcastReceiver有两种注册方式:静态在AndroidManifest.xml中声明,动态在代码中注册。同时,权限控制也会影响广播的接收与发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、android的广播机制包含两部分的内容

。广播(Broadcast):用于发送广播
。广播接收器(BroadcastReceiver):用于接收广播


2、BroadCast

发送广播信息,把要发送的信息和用于过滤的信息装入一个Intent对象中,然后调用Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把Intent对象以广播的方式发送出去。

Intent intent = new Intent(INTENAL_ACTION_3);
intent.putExtra("Name", "hellogv");
intent.putExtra("Blog", http://blog.youkuaiyun.com/hellogv);
sendBroadcast(intent);//传递过去


3、BroadcastReceiver

BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件,当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。


4、注册BroadcastReceiver的方式

静态:在AndroidManifest.xml中用<receiver>标签申明注册,并在标签内用<intent-filter>标签设置过滤器。

静态注册必选新建一个类,此类是继承BroadcastReceiver的,并且实现它的onReceive()方法。
/*
 * 接收静态注册广播的BroadcastReceiver,
 * step1:要到AndroidManifest.xml这里注册消息
 *         <receiver android:name="clsReceiver2">
            <intent-filter>
                <action
                    android:name="com.testBroadcastReceiver.Internal_2"/>
            </intent-filter>
        </receiver>
   step2:定义消息的字符串
    step3:通过Intent传递消息来驱使BroadcastReceiver触发
 */
public class clsReceiver2 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(context, "静态:"+action, 1000).show(); 
    }
}
据说:在onReceiver方法里最好不要有执行超过5s的代码,否则android系统就会弹出一个超时对话框。建议是把写在一个单独的线程里边来执行。

然后在AndroidManifest.xml添加receiver标签:
<receiver android:name="clsReceiver2">      
   <intent-filter>          
      <action android:name="com.testBroadcastReceiver.Internal_2"/>
   </intent-filter>  
</receiver>
第一个name是类名,即继承了BroadcastReceiver的类的名字(整体路径);
第二个name是action的名字,即要监听的消息名字(其他消息都会被过滤不监听)

动态:先定义并设置好一个IntentFilter对象,然后在需要注册的地方调 Context.registerReceiver()方法,如果取消就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(String); //为BroadcastReceiver指定action,即要监听的消息名字。
registerReceiver(MyBroadcastReceiver,intentFilter); //注册监听
unregisterReceiver(MyBroadcastReceiver); //取消监听
(一般:在onStart中注册,onStop中取消unregisterReceiver)

private class MyBroadcastReceive extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent){
         String action = intent.getAction(); 
         if(intent.ACTION_BATTERY_CHANGED.equals(action)) //判断是否接到电池变换消息 
           {
             //处理内容
           }
    }
}

另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses-permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个BroadcastReceiver所接收。


实例:(动态加入的方法,建议还是通过xml注入的方式比较好)
// 发送
button14.setOnClickListener(new Button.OnClickListener() {
	@Override
	public void onClick(View v) {
		IntentFilter intentFilter = new IntentFilter();  
		intentFilter.addAction("com.snda.action.broadcast");  
		// 每次都是需要注册一下的,否则将不会有响应
		registerReceiver(new MyBroadcastReciver(), intentFilter);  
		        
		Intent intent = new Intent();  
	    intent.setAction("com.snda.action.broadcast");  
	    // 要发送的内容   
	    intent.putExtra("author", "Abel");  
	    // 发送 一个无序广播   
	    MainActivity.this.sendBroadcast(intent);  
	}
});

// 接收
public class MyBroadcastReciver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if(action.equals("com.snda.action.broadcast")){
			String author = intent.getStringExtra("author");
			Toast.makeText(context, author, 1).show();  
			// 代码中的实现需要自己实现取消广播的功能
			context.unregisterReceiver(this);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值