Android broadcast初探

本文详细介绍了Android中的广播机制,包括广播的定义、功能及其在应用间通信中的作用。此外还探讨了广播的实现方式,例如如何创建广播接收器、动态与静态注册方式的区别,以及自定义全局广播和本地广播的不同之处。

Broadcast定义

android 广播的是Intent,广播接收者通过定义BroadcastReciever来定义接收(监听)感兴趣的内容,可以是系统的也可以是其他APP的。

Broadcast的功能

  • 实现APP之间的通信
  • 实现APP之间的逆向绑定,广播者无需在一开始就关心是谁需要监听他,实现灵活的注册

Broadcast的实现方式

广播接收者

  1. 实现广播接收器:继承BroadcastReciever,实现onReceive()方法
  2. 使用广播接收器,并注册相关广播的接收,有两种方式。

    1. 动态注册:在Activity中注册,使用方法registerReceiver(BroadcastReceiver,IntentFilter);该方法使用到广播接收器和Intent过滤器,过滤器注册需要监听的广播。代码如下

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          setContentView(R.layout.activity_main);
      
          IntentFilter intentFilter = new IntentFilter();
                  intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
      
          nbr= new NetBroadcastReceiver();
          registerReceiver(nbr, intentFilter);
      }
      
      @Override
      protected void onDestroy() {
          super.onDestroy();
          //动态注册一定要记得取消注册
          unregisterReceiver(nbr);
      }
    2. 静态注册:在AndroidManifest.xml中通过 <receiver> 来注册。这种方式可以不用等到APP启动就可以接受广播消息。如下定义的广播接收器可以接收系统重启完成后的广播消息,并在onReceive方法中进行相关处理。以下配置自动监听系统启动广播,导致APP会在系统重启后自动启动。

      <receiver 
              android:name="com.example.broadcasttest.BootCompleteReceiver">
              <intent-filter >
                  <action android:name="android.intent.action.BOOT_COMPLETED"/>
      
              </intent-filter>
      
              </receiver>

注意: 因为广播接收者的调用是在主线程,所以广播接收器不能成立比较耗时的工作,否则可能会被强制中断而报错,也不能打开一个对话框等待业务输入。

自定义全局广播

发送标准广播:无序的

  1. Activity中有sendBroadcast(Intent)的方法,可以生成全局广播,同时Intent可以携带数据。实例代码如下:

    Button b = (Button)findViewById(R.id.sendBroadcast);
        b.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent in =new Intent("com.example.broadcast.MY_BROADCAST");
                sendBroadcast(in);//发送全局广播
            }
        });

发送有序广播

  1. 有序广播接收是按广播接收器配置的优先级的高低来先后接收消息的,高优先级的广播接收器,先接收,并可以终止广播的进一步传递给后续接收器。有序广播的触发很简单,调用Activity.sendOrderedBroadcast()方法。而广播接收器的优先级可以通过配置priority设置。

    Button b = (Button)findViewById(R.id.sendBroadcast);
        b.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent in =new Intent("com.example.broadcast.MY_BROADCAST");
                sendOrderedBroadcast(in,null);//发送全局有序广播
            }
        });

    配置AndroidMenifest.xml,在intent-fitler中增加Intent-priority的属性

    <receiver 
            android:name=".MyBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.example.broadcast.MY_BROADCAST"/>
    
            </intent-filter>
    
            </receiver>

本地广播

  1. 本地广播和全局广播的区别
    • 本地广播只能是本APP的接收器接收,外部APP是无法接收的。相对比较安全。
    • 全局广播是所有APP都可监听,如果使用不当会泄露信息。
    • 本地广播处理效率比全局的高。
  2. 本地广播使用方式:
    本地广播的触发方式简单,使用LocalBroadcastManager来广播,注册和取消注册。就是说,广播由LocalBroadcastManager来统一管理。
    //首先通过工厂模式获取LocalBroadcastManager的实例    
    LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
   .....
   //创建广播
     Intent intent = new Intent("broadcastname");
     lbm.sendBroadcast(intent);//发送本地广播
  ...
   //设置广播接收器的过滤器(可以同时监听多个)
   IntentFilter intentf = new IntentFilter();
   intentf.addAction("broadcastname");
   //别处定义好本地广播接收器的类,关键是实现方法类onRecieve()
   LocalBroadcastReceiver lbr = new LocalBroadcastReceiver();
   //设置监听
   lbm.registerReceiver(lbr,intentf);
  ...
    //注意在合适地方释放监听器,比如Activity.onDestroy()
    lbm.unregisterReceiver(lbr);
  1. 3.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值