Android基础之五:四大组件(Broadcast Receiver)

  • Broadcast Receiver做为Android四大组件之一,在整个系统中普遍运用,系统中存在各类各样的广播机制,例以下载,网络等都有具体的广播接收器
  • 广播在很大程度上简化了开发,能够经过广播监听系统状态变化,监听另外一App中事件传递,能够接收当前App中不一样组件,不一样UI、不一样线程之间的消息传递
  • 广播的建立与使用
    • 建立一个继承自BroadcastReceiver类的子类,重写onReceiver方法
    • public class MReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              //ToDo
          }
      }
    • 注意在onReceive中不能处理耗时操做,通常不能超过6s,超过6s就会报Exception异常,若是有耗时操做,都放到辅助线程中运行,辅助线程具体参考Android基础之多线程开发
    • Manifest中须要注册该Receiver
      • receiver节点
        • 属性:name:指定receiver类路径
        • 子节点intent-filter
          • 属性:priority:优先级,-1000~1000,优先级高的可以早接收到广播,只有sendOrderedBroadcast发送才有用
          • 子节点
            • action:标识,为隐式Intent调用准备,能够跨应用接收广播
    • <receiver android:name=".MReceiver" android:exported="true">
           <intent-filter android:priority="100">
               <action android:name="com.example.AndroidTest_01.receiver1"></action>
           </intent-filter>
      </receiver>
    • 完成注册后并非在应用启动的时候广播接收器才启用,而是一直运行在系统中,无论应用是打开仍是退出,都会启用,在接收到消息后都会执行onReceiver,尽管App已经退出了,所以这里若是须要与App进行交互,须要注意
    • 跨应用接收广播,或者接收系统广播须要设置android:exported=true;
    • 发送广播
      • 建立广播Intent
        • 显式建立Intent
        • Intent intent1=new Intent(MyActivity.this,MReceiver.class);
          sendBroadcast(intent1);
        • 隐式建立Intent
        • Intent intent1=new Intent();
          intent1.setAction("com.example.AndroidTest_01.receiver1");
          sendBroadcast(intent1);
      • 发送广播
        • 普通发送
        • sendBroadcast(intent1);
        • 有序发送
        • sendOrderedBroadcast(intent1,null);
        • 有序广播配合广播注册优先级使用,可以控制接收器接收顺序,而且在优先级高的接收器中能够中止对优先级低的接收器进行继续广播
        • @Override
          public void onReceive(Context context, Intent intent) {
              //ToDo
              abortBroadcast();
          }
        • 滞留广播发送StickyBroadcast、StickyOrderedBroadcast
          • 滞留广播具体表现为能够先发送消息,再注册接收,即先上船后补票
          • 当发送滞留广播时,系统会保留最后发送的一条滞留广播所带信息,当有符合要求的接收器注册时都会自动收到带有该信息的广播
          • StickyBroadcast与StickyOrderedBroadcast的区别同Broadcast与OrderedBroadcast同样
          • 既然可以保存在系统中,那么也就可以删除,删除方法是removeStickyBroadcast
  • 动态注册与静态注册
    • 在Manifest中注册是静态注册,在应用安装后就自动注册到系统中,这种方式长期消耗内存,适合监听系统广播以及应用生命周期中一直使用的广播
    •  Android还支持一种代码中注册的方式,可以灵活实现接收器注册,适合运用在应用内部监听的消息广播
    • 动态注册方式
      • 注册
      • registerReceiver(new MReceiver(),new IntentFilter("com.example.AndroidTest_01.receiver1"));
      • 既然有动态注册那就有对应的动态取消注销
      • MReceiver receiver=new MReceiver();
        unregisterReceiver(receiver);
      • 动态注销须要经过注册时的实例来注销,所以静态注册的接收器不能动态注销,只有动态注册时保存实例引用才能注销
      • 注册与注销配合使用可以优化应用性能,减小没必要要的资源消耗
  • 发送局部广播与全局广播
    • 默认的发送广播消息是全局广播,系统中全部符合要求的接收器都可以接收到广播消息
    • 局部广播
      • 经过LocalBroadcastManager来发送局部广播
      • LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(MyActivity.this);
        localBroadcastManager.sendBroadcast(new Intent("com.example.AndroidTest_01.receiver1"));
      • 经过LocalBroadcastManager发送的广播可以只在当前应用中传播,不会想其余App发送广播,保证了数据隐私性
      • 经过LocalBroadcastManager注册的接收器也不会接收到其余App发过来的消息,可以防止其余App进行攻击
      • LocalBroadcastManager比全局系统广播更加高效
      • 一般使用局部广播来在应用中进行广播事件纷发与接收,配合动态注销广播的运行可以最大化提升应用效率
相关文章
相关标签/搜索