zoukankan      html  css  js  c++  java
  • 广播 BroadCastReceiver

    广播 BroadCastReceiver - @与非 - 博客园

    1.概述

    Broadcast Receiver包含两部分功能: 发送和接收广播消息

    调用sendBroadCast()方法发送广播,即发送一个Intent

    发送广播只能启动广播接收器Receiver对象

    接收广播Receiver,它和Activity、Service在架构上是平等的

    Receiver没有界面,其生命周期非常短,在执行onReceive()方法中才有效,一旦onReceive()

    方法执行完毕,该Receiver的生命期就结束,。

    广播消息分为两类: 系统定义的一些广播消息和自定义广播消息

    接收消息的方式:

    静态接收:当程序安装时就声明其内部的广播接收器

    动态接收:通过调用registerReceiver()方法向系统注册一个Receiver,动态接收多用于一个应用程序的内部

    每个接收器(Receiver)内部都有一个onReceive()方法

    2.广播消息的方式

    同步广播和异步广播

         
      clip_image001
     
      clip_image002

    广播的分类

    普通广播(Normal Broadcast):是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。

    有序广播(Ordered Broadcast):该广播的接收者将按预先声明的优先级依次接收广播。有序广播接收者可以终止广播的传播(通过调用abortBroadcast()方法),广播的传播一旦终止,后面的接收者就无法接收到广播。另外,广播的接收者可以将数据传递给下一个接收者(通过setResultExtras(Bundle bundle)方法)。

    3.广播实例

    发送广播sendBroadcast(intent)

    接收广播。四大组件之一---广播接收者Broadcast Receiver。

    类似于事件处理。不过事件处理是同一个程序内部,而广播的处理机制则是系统级别的(可用于不同应用程序之间)。

    实现方式为:

    写个类继承BroadcastReceiver,覆盖方法onReceive()

    在配置文件中配置

    step1.写一个类继承BroadCastReceiver,重写onReceive()方法

    step2.在AndroidManifest.xml中注册广播(称为静态注册)

    <receiver android:name=".MyReceiver">
    <intent-filter>
    <action android:name="com.anjoyo.receiver"/>
    </intent-filter>
    </receiver>

    动态注册:

    复制代码
    @Override
    
    protected void onStart() {
    
    super.onStart();
    
    receiver = new MyReceiver();
    
    IntentFilter filter = new IntentFilter();
    
    filter.addAction("com.anjoyo.receiver");
    
    registerReceiver(receiver, filter);
    
    }
    
    @Override
    
    protected void onDestroy() {
    
    super.onDestroy();
    
    unregisterReceiver(receiver);
    
    }
    复制代码

    step3.发送广播

    隐式通过action找到相应的receiver组件

    Intent intent = new Intent("com.anjoyo.receiver");
    
    sendBroadcast(intent);

    显示通过类名找到本程序的receiver组件

    Intent intent = new Intent(context,MyReceiver.class);
    
    sendBroadcast(intent);

    Receiver例子代码:

    复制代码
    public class MyReceiver extends BroadcastReceiver {
    
    @Override
    
    public void onReceive(Context context, Intent intent) {
    
    Intent intent2 = new Intent("com.anjoyo.activity");
    
    intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    context.startActivity(intent2);
    
    }
    
    }
    复制代码

    Activity配置:

    复制代码
    <activity android:name=".SecondActivity">
    
        <intent-filter>
    
            <action android:name="com.anjoyo.activity"/>
    
            <category android:name="android.intent.category.DEFAULT"/>
    
        </intent-filter>
    
    </activity>
    复制代码

    同步方式发送(sendOrderBroadcastReceiver(intent))的广播,如何注册广播接收器的优先级?通过给

    <intent-filter android:priority="1000">
    
    <action android:name="com.anjoyo.receiver"/>
    
    </intent-filter>

    值越大优先级越高。

    注意:

    每次系统广播(Broadcast)事件发生后,系统就会创建对应的BroadcastReceiver实例,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。

    如果BroadcastReceiver的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在广播接收者的onReceive()方法里执行一些耗时的操作,否则会弹出ANR(Application No Response)的对话框。

    动态注册:

    动态创建Receiver

    不需要在xml文件中声明该Receiver

    需要调用registerReceiver()方法向应用程序的Context注册

    receiver = new MyReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction("com.anjoyo.receiver");
            registerReceiver(receiver, filter);

    一般在程序的onPause()方法中调用unregisterReceiver()以注销Receiver对象

    unregisterReceiver(receiver);

    如果没有注销Receiver,那么该Receiver会一直处于接收广播消息就绪的状态,直到该程序的Context被销毁

    监听系统开机广播android.intent.action.BOOT_COMPLETED(可以用来设置开机启动项)

    代码实现:接收到开机事件后BroadcastReceiver启动一个Activity作为响应

    1.写一个类继承BroadReceiver,实现OnReceiver方法

    复制代码
    public class MyReceiver extends BroadcastReceiver {
    
        public void onReceive(Context context, Intent intent) {
    
            Intent intent = new Intent(context,MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            context.startActivity(intent);
        
        }
    
    }
    复制代码

    2.完成MainActivity

    3.在AndroidManifest.xml配置

    复制代码
    <receiver android:name=".MyReceiver">
    
        <intent-filter>
    
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
    
        </intent-filter>
    </receiver>
    复制代码

    访问系统开机事件的权限:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  • 相关阅读:
    Linux停SVN提交时强制写日志
    svn文件提交时强制写注释
    ssh 登录出现的几种错误以及解决办法
    Linux内存调试工具初探-MEMWATCH
    段错误调试神器
    Linux环境下段错误的产生原因及调试方法小结
    pthread_create()之前的属性设置
    Linux netstat命令详解
    Linux route命令详解和使用示例(查看和操作IP路由表)
    tomcat最大线程数的设置
  • 原文地址:https://www.cnblogs.com/seven1979/p/4333049.html
Copyright © 2011-2022 走看看