Android BroadcastReceiver
来源:互联网 发布:怎样退货给淘宝卖家 编辑:程序博客网 时间:2024/05/17 03:44
一、概述
BroadcastReceiver 意思就是广播的意思,那在我们的平时生活中,如果有人发送广播的时候,当我们听到广播的时候会进行一些列的动作,那 Android 中的广播和我们生活中的广播用法大致相同,那广播我们要关注的就是两个功能,一个就是发送广播,另一个就是接受广播,那我们的 BroadcastReceiver 的作用就是广播接受者,当我们把 BroadcastReceiver 归结到我们的四大组件的时候,那我们首先想到的就是注册了,因为四大组件都需要在 AndroidManifest 中注册的,那下面我们就看一下 BroadcastReceiver 的注册方式。
二、注册方式和 BroadcastReceiver 实现
BroadcastReceiver 的注册方式分为两种,静态注册和动态注册
静态注册:
public class FristReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Log.e("firstbroadcastreceiver:",msg); Bundle bundle = new Bundle(); bundle.putInt("code",11111); setResultExtras(bundle); } }
我们可以看到我们的 FristReceiver 中只有一个方法,那这个方法中只有一个方法,那这个 onReceiver 方法,那这个方法也就是我们 BroadcastReceiver 的主方法,当我们有对应的广播发送的时候,onReceiver 就会执行。好了那下面我们看一下注册的代码:
<receiver android:name=".SecondReceiver"> <intent-filter > <action android:name="com.andya.fristReceiver"/> </intent-filter> </receiver>
那从这个注册中我们可以看到,我们指定了一个 action 那我们接受到的广播也是一定要与这个 action 相匹配的,一般的 action 的 name 都是包名加上 BroadcastReceiver 的名字。静态注册我们就看到这里,下面说一下动态注册
动态注册:
fristReceiver = new FristReceiver(); tvStartActivity = (TextView)findViewById(R.id.tv_start_activity); IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver"); registerReceiver(fristReceiver,intentFilter);
从这段代码中我们可以看到,注册需要两个变量一个是 BroadcastReceiver 一个是 IntentFilter 那这个 IntentFilter 可以 add 多个 Action 也就是我们的广播可以相应多个 Action,那我们注册的这个广播可以相应 com.andya.firstReceiver 这个 Action。
通过注册我们只是完成了广播的一部分,也就是等待功能,当有广播发送的时候,我们会用发送的广播与我们的 Action 相匹配,当匹配成功的时候,就会执行 onReceiver 的代码。
三、发送广播
注册和创建广播的基本用法我们了解的差不多了,那这一节我们主要讲的就是发送广播,那发送广播的方式也可以分为两种,一种是发送正常的广播,一种是发送有序广播。
正常广播:
当我们发送正常广播的时候,主要我们的广播和对应的 BroadcastReceiver 能匹配上,那我们的广播就会执行,也就是说他没有接受的顺序,没有中断,只要能匹配上,那就可以指定 onReceiver ,下面看一段代码:
Intent intent = new Intent("com.andya.fristReceiver"); intent.putExtra("msg","hello broadcastReceiver"); sendBroadcast(intent);
从上面的代码中可以看出当我们发送广播的时候需要申请一个 Intent,那后我们调用 sendBroadcast 方法去发送广播,这种方式很简单没有任何限制。
有序广播:
IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver"); intentFilter.setPriority(3000); registerReceiver(fristReceiver,intentFilter);
<receiver android:name=".SecondReceiver"> <intent-filter android:priority="2000"> <action android:name="com.andya.fristReceiver"/> </intent-filter> </receiver>
可以看到我们配置了一个值为 2000 一个值为3000,一个为动态配置 一个为静态配置,那如果我们发送有序广播的时候一定是这个 3000 的先收到的。
<receiver android:name=".PriorityReceiver$HigthReceiver"> <intent-filter android:priority="3000"> <action android:name="com.andya.priorityreceiver"/> </intent-filter> </receiver> <receiver android:name=".PriorityReceiver$LowReceiver"> <intent-filter android:priority="1000"> <action android:name="com.andya.priorityreceiver"/> </intent-filter> </receiver> <receiver android:name=".PriorityReceiver$NormalReceiver"> <intent-filter android:priority="2000"> <action android:name="com.andya.priorityreceiver"/> </intent-filter> </receiver>
可以看到三个里面有三个优先级,下面看一下我们在 onReceiver 中的处理:
package com.example.andya.broadcastreceivertest;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by andya on 2017/7/4. */public class PriorityReceiver { public static class HigthReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { int code = 1; String data = "hello setResultAndData"; Bundle bundle = null; setResult(code,data,bundle); } } public static class NormalReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.e("NormalReceiver code:",String.valueOf(getResultCode())); Log.e("NormalReceiver data:",String.valueOf(getResultData())); } } public static class LowReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { } }}
四、发送本地广播
有时候我们会有这样的需求,也就是说我们的广播只能被我们的 app 所受到,当你有这样的需求的时候,本地广播就是你最好的选择,我们的本地广播刚好能满足你的需求,也就是说当我们用本地广播发送的时候,只有我们的 app 能收到我们的广播,其他 app 是收不到的,下面看一段代码:
IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver"); intentFilter.setPriority(3000); fristReceiver = new FristReceiver(); localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(fristReceiver, intentFilter);
这里面是注册的代码,可以看到我们需要通过 LocalBroadcastManager 去进行注册,下面看一下发送的代码:
Intent intent = new Intent("com.andya.fristReceiver"); localBroadcastManager.sendBroadcast(intent);
也是通过 LocalBroadcastManager 进行发送的。
通过这种方式发送的广播只有我们的 app 能收到。
总结:
- Android:BroadcastReceiver
- android BroadcastReceiver
- Android BroadcastReceiver
- BroadcastReceiver Android
- Android BroadcastReceiver
- android BroadcastReceiver
- Android BroadCastReceiver
- Android BroadcastReceiver
- Android BroadcastReceiver
- android BroadcastReceiver
- android BroadcastReceiver
- Android BroadcastReceiver
- Android BroadcastReceiver
- android BroadcastReceiver
- Android BroadcastReceiver
- Android BroadcastReceiver
- Android BroadcastReceiver
- android BroadcastReceiver
- 利用反射实现简单的Class对象和Bson文档的转换
- Java_基础—Map集合的遍历之键找值
- 算法效率测试(以排序算法为例)
- Android Issue Sharing
- 第十六天,jsp,el表达式
- Android BroadcastReceiver
- 4-20mA 0-5V工业标准信号回望笔录
- COGS1442 [NOIP2013] 华容道
- concurrent包
- android中解析xml
- 《数字图像处理》第三版笔记(六)频率域滤波
- java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
- GSON
- MobX 入门教程