zoukankan      html  css  js  c++  java
  • android学习日记19--四大组件之BroadcastReciver(广播接收者)

    二、BroadcastReciver(广播接收者)

     

    1、简述
      BroadcastReciver位于android.content包下,主要用于对广播消息(Intent)的过滤并响应的控件。可以理解为全局的监听器。
    BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个广播消息后,BroadcastReceiver可以启动Activity作为响应,
    或者启动Service服务等等。

     

    2、运行原理
      当其他应用程序发出广播消息之后,所有注册了BroadcastReciver的应用程序将会检测注册时的(过滤器)IntentFilter是否与发出的广播消息相匹配,
    匹配则会调用BroadcastReciver的onReceive()方法进行处理。所以开发BroadcastReciver应用,主要是对onReceive()方法的实现

     

    3、生命周期
      生命周期不像Activity那么复杂,一般生命周期是:启动(被其他程序调用,接收到匹配的广播)-->运行(执行onReceive()方法)-->结束(释放资源)
    每次广播到来时,会重新创建BroadcastReceiver对象 ,并且调用onReceive()方法,执行完以后,该对象即被销毁。当onReceive()方法在10秒内没有执行完毕,
    Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出 ANR(Application NoResponse)的对话框。

     

    4、广播的类型
      主要有以下两种类型:
      a、普通广播
      普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作,也无法将处理结果传递给下一个接收者。
      b、有序广播
      有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播,并且优先级高的广播可以传递消息给优先级底的广播。


    5、广播的收发
      a、发送广播:构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法
      b、接收广播:通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件

     

    6、广播的注册
      创建完BroadcastReceiver之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址,否则无法接收广播
      一般有如下两种注册:
      a、静态注册

    1 <receiver android:name=".MyReceiver">
    2 <intent-filter>
    3 <action android:name="android.intent.action.MY_BROADCAST"/>
    4 <category android:name="android.intent.category.DEFAULT" />
    5 </intent-filter>
    6 </receiver>

      b、动态注册

    1 MyReceiver receiver = new MyReceiver();
    2 
    3 IntentFilter filter = new IntentFilter();
    4 filter.addAction("android.intent.action.MY_BROADCAST");
    5 
    6 registerReceiver(receiver, filter);

      两种注册方法的区别是静态注册是常驻内存的,应用关闭是也可以接收广播,而动态注册是根着程序的生命周期,所以当这个程序退出时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册。这时要加入解除注册的代码:

    1 @Override
    2 protected void onDestroy() {
    3 super.onDestroy();
    4 unregisterReceiver(receiver);
    5 }

     

    7、运行实例

    写个例子,运行程序时发送广播,后台日志打印消息。

    MyReceiver代码:

     1 public class MyReceiver extends BroadcastReceiver {
     2 
     3     private static final String TAG = "MyReceiver";
     4     
     5     @Override
     6     public void onReceive(Context arg0, Intent intent) {
     7         // TODO Auto-generated method stub
     8         String msg = intent.getStringExtra("msg");
     9         Log.i(TAG, msg); 
    10     }
    11 
    12 }

    Activity发送广播代码:

    1      Intent intent = new Intent("android.intent.action.MY_BROADCAST");
    2         intent.putExtra("msg", "Hello Receiver!");
    3         sendBroadcast(intent);

    直接用静态注册广播。上述例子的广播是我们自己写的。Android提供许多丰富的原生广播地址。常用如下:

      开机启动:<action android:name="android.intent.action.BOOT_COMPLETED"/> 

      网络连接:<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

      电量变化:<action android:name="android.intent.action.BATTERY_CHANGED"/>

      时间改变:<action android:name="android.intent.action.DATE_CHANGED"/>

    只要更改自定义Receiver就可以触发一些相应事件。

     

  • 相关阅读:
    vs整合MySQL和QT
    VS2019中QT连接及使用
    JavaScript 进阶入门
    解决MySQL workbench的resultgird不出现的问题
    JavaScript入门
    CSS学习
    Linux下如何查看tomcat是否启动、查看tomcat启动日志
    oracle常见的函数
    java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
    位运算(&、|、^、~、>>、<<)
  • 原文地址:https://www.cnblogs.com/aiguozhe/p/3617790.html
Copyright © 2011-2022 走看看