广播 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"/>
原文地址:https://www.cnblogs.com/seven1979/p/4333049.html