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" 优先级指定
    // 同级别动态注册优先级高于静态注册
    // 数据不能处理

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

     


























  • 相关阅读:
    changing a pointer rather than erasing memory cells
    验证码识别 edge enhancement 轮廓增强 region finding 区域查找
    Manipulating Data Structures
    passing parameters by value is inefficient when the parameters represent large blocks of data
    Aliasing 走样
    Artificial Intelligence Research Methodologies 人工智能研究方法
    Thread safety
    include pointers as a primitive data type
    flat file
    functional cohesion
  • 原文地址:https://www.cnblogs.com/my334420/p/6735917.html
Copyright © 2011-2022 走看看