zoukankan      html  css  js  c++  java
  • Android攻城狮组件篇—BroadcastReceiver

    组件篇—BroadcastReceiver
    1. Boastcast(广播)是一种广泛运用的在应用程序之间传输信息的机制。
    2. BroadcastReceiver(广播接受者)是对发送出来的广播进行过滤并响应的一类组件,它就是用来接收来自系统和应用中的广播。
    3. 用途:
    * 当开机完成后系统会产生一条广播;有些程序会接收此广播而启动程序,这就是“自启动”。
    * 当网络状态改变时系统会产生一条广播;一般用于提示用户。
    * 当电池电量改变时,系统会产生一条广播;
    * 其他。
    ----------------
    为什么需要广播?
    假如没有广播,那么,很多事情都要自己做,需要自己想办法去获取数据。
    有了广播,我们只需等待广播告诉我们信息。
    广播的优点:
    1. 大大减少开发的工作量和开发周期
    2. 作为应用开发者,只需要掌握 BroadcastReceiver,不需要了解底层实现。

    使用方法:
    发送:
    1. 把信息装入一个 Intent对象(如Action、Category)
    2. 通过调用相应的方法将 Intent对象以广播方式发送出去:
       sendBroadcast()
       sendOrderBroadcast()
       sendStickyBroadcast()
    接收:
       当 Intent 发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver的 onReceive()方法。所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceive()方法。
    
    注意:BroadcastReceiver需要注册
       * 静态注册
       * 代码注册
    注意!!!!
    1. BroadcastReceiver 生命周期只有十秒左右。
    2. BroadcastReceiver 里面不能做一些耗时操作(就是因为生命周期短)
    3. 耗时操作应该通过发送 Intent 给 Service,由Service来完成
    4. 不能使用子线程。使用子线程不可靠!因为BroadcastReceiver生命周期太短,可能接收都结束了,子线程还没结束。接收器一旦结束了,Receiver所在的进程很容易在需要的时候被杀死,因为此时它是空进程(没有任何活动组件的进程就是空进程),一旦宿主进程被杀掉了,那么正在工作的子进程也会被杀死。
    
    
    广播的种类:
    1. 普通广播(Normal broadcasts)
       所有监听该广播的广播接收者都可以监听到该广播。
    2. 有序广播(Ordered broadcasts)
       按照接收者的优先级顺序接收广播,优先级别在 intent-filter中的priority中声明,-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。
    3. 异步广播(粘滞性滞留广播)
       不能将处理结果传给下一个接收者,无法终止广播。
    

     -------------------------

    普通广播的示例:

    -------------------------------

     1 普通广播的示例:
     2 1. 先在主界面设置一个Button,设置点击事件doClick。
     3 2. 在 MainActivity 中实现方法doClick():
     4 public void doClick(View view){
     5   switch (view.getId()){
     6     case R.id.btn_send1: // 发送普通广播
     7       Intent intent = new Intent(); // 发送信息就要创建一个Intent
     8       intent.putExtra("msg","这是一条普通广播");
     9       // 设置一个标识,用于过滤(会在注册的时候用到)
    10       intent.setAction("BC_ONE");// 其实这里最好使用完整类名,但因为只是举个例子,所以写成“BC_ONE”
    11       // 将intent发送出去
    12       sendBroadcast(intent);
    13       break;
    14   }
    15 }
    16 然后新建一个类 BC1 ,继承 BroadcastReceiver 并实现方法 onReceive():
    17 public void onReceive(Context context, Intent intent) {
    18    String s = intent.getStringExtra("msg");
    19    System.out.printf("receive1收到消息:"+s);
    20 }
    21 最后,在配置文件 AndroidManifest中注册接收者:
    22 <receiver android:name=".BC1">
    23     <intent-filter android:priority="100">
    24          <action android:name="BC_ONE"></action>
    25     </intent-filter>
    26 </receiver>
    27 其中 android:priority="100" 是把优先级设置为100,一般的范围是-1000到1000。
    28 -----------------
    29 截断广播: abortBroadcast();
    30 普通广播之下,若在优先级较高的BC2的类里面添加:
    31  abortBroadcast();
    32 是不能截断广播的,BC1仍然会收到广播,并且系统会报错。
    动态注册
    在 MainActivity 的onCreate()方法里面直接注册:
    IntentFilter intentFilter = new IntentFilter("BC_ONE"); // 动态注册所需的过滤器
    BC3 bc3 = new BC3(); // 动态注册的对象
    registerReceiver(bc3,intentFilter); // 接收器的动态注册
     1 public class MainActivity extends Activity {
     2 
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         setContentView(R.layout.fragment_main);
     7         // 动态注册
     8         
     9         /*
    10         IntentFilter filter = new IntentFilter("bc1");
    11         BC1 bc1 = new BC1();
    12         registerReceiver(bc1, filter);
    13         */
    14 
    15     }
    16 
    17     public void doClick(View view) {
    18         switch (view.getId()) {
    19         case R.id.button1:// 发生普通广播
    20             Intent intent = new Intent();
    21             intent.putExtra("msg", "这是普通广播");
    22             intent.setAction("bc1");
    23             sendBroadcast(intent);
    24             break;
    25         case R.id.button2:// 发生有序广播
    26             Intent intent2 = new Intent();
    27             intent2.putExtra("msg", "这是有序广播");
    28             intent2.setAction("bc1");
    29             sendOrderedBroadcast(intent2, null);
    30             break;
    31             
    32         case R.id.button3:// 发生普通广播
    33             Intent intent3 = new Intent();
    34             intent3.putExtra("msg", "这是有序广播");
    35             intent3.setAction("bc3");
    36             sendStickyBroadcast(intent3);
    37             IntentFilter filter = new IntentFilter("bc3");
    38             BC3 bc3 = new BC3();
    39             registerReceiver(bc3, filter);
    40             break;
    41         }
    42     }
    43 }

     

    “粘滞性”是需要在配置文件中添加权限的:异步:
    <uses-permission android:name="android.permission.BROADCAST_STICKY"></uses>

    总结:

    // 普通广播不能被截断,
    // 同级别接收先后是随机的
    // 可以由清单文件中android:priority="100" 优先级指定
    // 同级别动态注册优先级高于静态注册
    // 数据不能处理

    // 有序广播能中断
    // 有序广播数据能处理----

     


























  • 相关阅读:
    兼容性和工程化
    对象
    用JavaScript实现学生管理系统
    用JavaScript实现视频弹幕发送
    数据结构
    数据结构和函数
    JavaScript的基本语法
    JS概括及基本语法
    MongoDB数据库的简单安装与使用
    epxress 的安装与配置
  • 原文地址:https://www.cnblogs.com/my334420/p/6735917.html
Copyright © 2011-2022 走看看