BroadcastReceiver总结

来源:互联网 发布:ubuntu命令行安装中文 编辑:程序博客网 时间:2024/05/17 21:47

一、广播机制简介

Android中引入了广播机制,用于组件之间、组件内部的消息传递。广播机制主要分为两个方面:广播发送者和广播接收器(BroadcastReceiver——对发送的广播进行过滤接收并响应)。发送者发出一条广播,“订阅”了该广播的接收器就能收到这条广播,并作出相应的响应。在Android中,广播被广泛地使用,例如:在开机后系统会产生一条广播,接收到该广播的应用程序就能启动服务。又如:应用程序在完成某个事件后发出一条广播,通知另一个应用程序。即广播有系统广播,应用程序也可以自定义广播。


二、广播的三种类型

  1. 普通广播(Normal Broadcasts):所有监听该广播的接收器都能收到广播,且没有先后顺序。接收器不能截断广播,也不能处理广播内容。
  2. 有序广播(Ordered Broadcasts):按照接收者的优先级顺序接收广播,优先级高者可以截断广播。接收者可以对广播内容进行处理。
  3. 异步广播:(粘滞性滞留广播):不能将处理结果传给下一个接收者,无法终止广播。

三、BroadcastReceiver的生命周期

每次广播到来时,会创建一个BroadcastReceive对象,并执行onReceive()方法,执行完后,该对象就会被立即销毁。BroadcastReceive整个生命周期只有十秒左右,如果onReceive()方法在十秒内没有执行完,程序会报错。因此,不能在onReceive()方法中做耗时操作,可以交由Service来完成。


四、BroadcastReceiver用法

1.自定义BroadcastReceiver

继承BroadcastReceiver,实现抽象方法onReceive(context,intent)。在onReceive方法中写收到广播后的响应事件。

public class TestBroadcastReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context,"Received Broadcast",Toast.LENGTH_LONG).show();    }

如果接收的是有序广播,则可在onReiceive方法中对广播内容进行处理或者调用abortBroadcast()方法来截断广播。

2.注册BrasdcastReceiver——静态 or 动态注册
1)静态注册

静态注册是在AndroidManifest.xml文件中配置的。通过这种方式注册的广播为常驻型广播,当应用程序关闭后,有相应事件触发程序还是会被系统自动调用运行。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.ginny.test">    <application    ...    android:theme="@style/AppTheme">    <activity android:name=".MainActivity">        <intent-filter>            <action android:name="android.intent.test.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />        </intent-filter>    </activity>    <receiver android:name=".AnotherBroad">        <intent-filter android:priority="100">   <!--设置优先级。数字越大优先级越大(同优先级,动态注册优先于静态注册)-->            <action android:name="com.example.MY_text">            </action>        </intent-filter>    </receiver></application></manifest>

在application标签中添加一个receiver标签,通过android:name指定接收器,然后在中添加要接收的广播。

2)动态注册

通过代码在.Java中注册。通过这种方式注册的广播会跟随Activity的生命周期,需要在Activity结束前调用unregisterReceiver(receiver)方法移除它。

TestBroadcastReceiver receiver=new TestBroadcastReceiver();IntentFilter filter=new IntentFilter();filter.addAction("com.example.MY_text");registerReceiver(receiver, filter);
动态注册的广播一定要注销
    @Override    protected void onDestroy() {        super.onDestroy();        unregisterReceiver(receiver);    }

五、发送广播

1.发送普通广播

创建一个Intent对象,传入要发送的广播的值,再调用sendBroadcast(intent)方法将广播发送出去。

Intent intent = new Intent("com.example.MY_text");sendBroadcast(intent);
2.发送有序广播

调用sendOrderedBroadcast(intent,receiverPermission)方法。该方法要传入两个参数,其中receiverPermisson是接收权限,可以为null,这里设置一个“TestPermission”权限。

Intent intent = new Intent("com.example.MY_text");sendOrderedBroadcast(intent,“TestPermission”);

在manifest中添加“TestPermission”权限。

    <permission android:name="TestPermission" android:protectionLevel="normal">    </permission>

声明要使用该权限

    <uses-permission  android:name="TestPermission"/>
3.发送异步广播

调用sendStickyBroadcast(intent)方法。

Intent intent = new Intent("com.example.MY_text");sendStickyBroadcast(intent);

发送异步广播需要在manifest中声明权限”android.permission.BROADCAST_STICKY”

<uses-permission android:name="android.permission.BROADCAST_STICKY" />

异步广播处理完之后的intent依然存在,直到把它去掉,即调用方法removeStickyBroadcast(intent);

原创粉丝点击