Android 广播:Broadcast

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。

要接收广播,首先得有广播接收器(BroadcastReceiver),而广播接收器是对发送出来的Broadcast进行过滤接受并响应的一类组件,广播接收器对感兴趣的广播进行注册,当有广播发送时,就能接收该广播。

  • 同一APP内部的同一组件内的消息通信(单个或多个线程之间); 
  • 同一APP内部的不同组件之间的消息通信(单个进程); 
  • 同一APP具有多个进程的不同组件之间的消息通信; 
  • 不同APP之间的组件之间消息通信; Android系统在特定情况下与App之间的消息通信

参考:小编君


Broadcase发送

在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendBroadcast() 等方法,把 Intent对象以广播方式发送出去。

//创建一个意向
Intent intent = new Intent();

//这条广播的标志,与清单文件的receiver的anction对应 
intent.setAction("com.broadcast.test");

//携带数据
intent.putExtra("msg", "这是自定义动态广播消息");

//发送广播
sendBroadcast(intent);

  当Intent发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 onReceive() 方法,所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法

  • 系统或应用发出广播时,将会扫描系统中的所有广播接收者,通过action匹配将广播发送给相应的接收者接收者收到广播后将会产生一个广播接收者的实例,执行其中的onReceiver()这个方法
  • 特别需要注意的是这个实例的生命周期只有10秒,如果10秒内没执行结束onReceiver(),系统将会报错。在onReceiver()执行完毕之后,该实例将会被销毁所以不要在onReceiver()中执行耗时操作,也不要在里面创建子线程处理业务(因为可能子线程没处理完,接收者就被回收了,那么子线程也会跟着被回收掉)。正确的处理方法就是通过调用activity或者service处理业务。

BroadcastReceiver的注册方式

BroadcastReceiver的注册方式只有两种,一种是静态注册(推荐使用),另外一种是动态注册。 在代码中注册的就是动态注册;在AndroidManifest.xml中注册是静态注册。

动态注册更灵活,能自由控制注册和注销,但必须要程序启动后才能接收广播;而静态注册虽然不那么灵活,但是这种可以注册方式可以让程序在未启动的情况下接收广播。

 静态方式定义一个广播接收器继承MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
    public MyBroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
    }
}

在AndroidManifest.xml的application里面定义receiver并设置要接收的action

//此广播接收者类是MyBroadcastReceiver
< receiver android:name = ".MyBroadcastReceiver" > 

    < intent-filter android:priority = "777" >
        //使用过滤器,接收指定action广播      
        <action android:name = "com.broadcast.test" /> 
    </ intent-filter > 

</ receiver >

  这里的priority取值是-1000到1000,值越大优先级越高,同时注意加上系统接收短信的限权。

< uses-permission android:name ="com.broadcast.test" />

  静态注册的广播接收者是一个常驻在系统中的全局监听器,当你在应用中配置了一个静态的BroadcastReceiver,安装了应用后而无论应用是否处于运行状态,广播接收者都是已经常驻在系统中了。同时应用里的所有receiver都在清单文件里面,方便查看。要销毁掉静态注册的广播接收者,可以通过调用PackageManager将Receiver禁用。


动态方式:定义一个广播接收器继承BroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
    public MyBroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
    }
}

在Activity中注册

public class MainActivity extends Activity {
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		
        //动态注册       
        MyBroadcastReceiver = new MyBroadcastReceiver(); //构造一个MyBroadcastReceiver实例           
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.broadcast.test");
        registerReceiver(MyBroadcastReceiver, filter);
		
        // 发送信息
        Intent intent = new Intent(); //使用intent来传递广播,初始化一个对象        
        intent.setAction("com.broadcast.test"); //这条广播的标志,用来识别哪些广播可以接受到我发送的广播消息       
        intent.putExtra("msg", "这是自定义动态广播消息"); //携带数据        
        sendBroadcast(intent); //发送广播		
	}
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(dynamicReceiver); //注销广播
    }
}

 与静态的不同就在于多了IntentFileter的生成和receiver的注册,相当于将在xml中receiver的注册变成用代码来进行注册 


  静态注册和动态注册的区别

  1、静态注册的广播接收者一经安装就常驻在系统之中,不需要重新启动唤醒接收者;动态注册的广播接收者随着应用的生命周期,由registerReceiver开始监听,由unregisterReceiver撤销监听,如果应用退出后,没有撤销已经注册的接收者应用应用将会报错。

  2、当广播接收者通过intent启动一个activity或者service时,如果intent中无法匹配到相应的组件。动态注册的广播接收者将会导致应用报错 而静态注册的广播接收者将不会有任何报错,因为自从应用安装完成后,广播接收者跟应用已经脱离了关系。 

参考链接:

1、BroadcastReceiver使用详解

2、Android四大组件之BroadcastReceiver详细解析

 

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值