广播 BroadCastReceiver


1.概述

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

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

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

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

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

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

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

接收消息的方式:

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

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

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

2.广播消息的方式

同步广播和异步广播

广播的分类

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

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

3.广播实例

发送广播sendBroadcast(intent)

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

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

实现方式为:

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

在配置文件中配置

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

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

动态注册:

@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 {

@Overridepublic 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"/>


你可能感兴趣的:(广播)