广播接收者是Android的四大组件之一,对于这个的定义也是很贴切,在Android系统中,当系统发生了一些状态的改变,系统会向所有的程序广播这个状态的变化。但是这些广播不是所有的我们都接收的,我们只会接收我们关注的广播,这里可以类比广播台,许多个广播台都在发送着不同的广播,我们可以用收音机根据调频接收我们想要听的广播,这里广播台发送的不同的广播,就相当于Android中发送的不同广播,这里的收音机就相当于我们的程序,我们通过设置我们的程序,就能接收到对应的广播。
对于广播接收者,我们想要使用它需要按照如下步骤:
1 自定义一个类并且继承BroadcastReceiver类,实现onReceive方法,这个方法会在接收到广播的时候调用
1 在AndroidMainfest.xml注册该BroadcastReceiver,并且配置相应的参数
下面定义一个广播接收者用于接收短信到来的广播,首先创建一个java类:
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
public class SmsReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
//创建一个短信
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
//获取发送手机号
String address = sms.getOriginatingAddress();
//获取短信的内容
String body = sms.getMessageBody();
//获取短信的时间
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(sms.getTimestampMillis()));
System.out.println(time);
System.out.println(address);
System.out.println(body);
}
//中断手机接收操作
abortBroadcast();
}
}
然后在AndroidMainfest.xml注册该BroadcastReceiver,
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
对于广播分为两种:有序广播和无序广播,
无序广播所有的广播接收者都可以接收到
有序广播会按照接收者优先级的顺序挨个的接收到,接收者可以使用abortBroadcast();方法随时停止该广播的继续传递
既然有广播的接收者,那么一定也有广播的发送者,在Android发送广播也是需要使用Intent,首先使用Intent创建一个意图,然后使用sendBroadcast(无序广播)或者sendBroadcast(有序广播)方法将广播发送出去。
看下面例子代码,创建了两个广播,并且按照两种方式发送出去了。
package com.mxy;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* 无序广播所有的广播接收者都可以接收到
* 有序广播会按照接收者优先级的顺序挨个的接收到,接收者可以随时停止该广播的继续传递
* @param view
*/
public void click(View view) {
Intent intent = new Intent();
intent.setAction("com.mxy.broadcastReceiver");
intent.putExtra("data", "测试数据");
this.sendBroadcast(intent);
Intent intent1 = new Intent();
intent1.setAction("com.mxy.OrderedBroadcastReceiver");
intent1.putExtra("data", "测试数据");
this.sendOrderedBroadcast(intent1, null);
}
}
下面看一下AndroidMainfest.xml中的相关配置:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.mxy.broadcastReceiver"></action>
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver1">
<intent-filter android:priority="1000">
<action android:name="com.mxy.OrderedBroadcastReceiver"></action>
</intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver2">
<intent-filter android:priority="10">
<action android:name="com.mxy.OrderedBroadcastReceiver"></action>
</intent-filter>
</receiver>
由上面可以看出无序广播由MyBroadcastReceiver接收,有序广播由MyBroadcastReceiver1和MyBroadcastReceiver2接收,但是他们两个的优先级不同,下面是这三个类的代码:
MyBroadcastReceiver.java
package com.mxy;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.i("mxy", "获取到data=" + data );
}
}
MyBroadcastReceiver1.java
package com.mxy;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcastReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.i("mxy", "MyBroadcastRecevier1获取到data=" + data );
//停止广播了
abortBroadcast();
}
}
MyBroadcastReceiver2.java
package com.mxy;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyBroadcastReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Log.i("mxy", "MyBroadcastRecevier2获取到data=" + data );
}
}
对于有序广播来说MyBroadcastReceiver2并不会接收到该广播,因为MyBroadcastReceiver1的优先级比较高,所以广播先呗MyBroadcastReceiver1接收到,并且MyBroadcastReceiver1在接收到后处理完调用了abortBroadcast方法,中断了广播的继续传播,所以优先级小MyBroadcastReceiver2并不能接收到该广播。
例子代码下载地址:http://download.csdn.net/detail/mengxiangyue/7278217
分享到:
相关推荐
NULL 博文链接:https://jiangnanlove.iteye.com/blog/1333335
广播接收器-BroadcastReceiver 电池电量显示
介绍了andorid四大组件之一的BroadcastReceiver
Android移动开发检测网络状态并使用BroadcastReceiver(广播接收者)进行接收网络变化的后续处理
广播接收者简单地说就是接收广播意图的Java类,此Java类继承BroadcastReceiver类,重写: public void onReceive(Context context,Intent intent),其中intent可以获得传递的数据; 广播意图就是通过Context....
主要为大家详细介绍了Android BroadcastReceiver接收收到短信的广播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
演示了BroadcastReceiver的简单用法。
这是一个关于Android中四大组件之一 —— BroadcastReceiver,即广播的一个demo,里面涉及到BroadcastReceiver的两种注册方式,也简单的实现了广播,通过点击按钮发送广播,收到广播后打印日志。
Android-BroadcastReceiver高级应用,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SystemBroadcastReceriver.html
ANDROID---当网络发生变化时使用BroadcastReceiver和service通知 博客地址:http://blog.csdn.net/zhang58246500/article/details/51536350
本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法。分享给大家供大家参考,具体如下: 这里介绍如何创建广播、如何发送一个无序广播和有序广播、以及监听短信以及监听呼出电话(当我们发短信和...
Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播
广播,这个诞生于1906年的科技产品,持续...Android通过广播机制,能够让订阅者接受到想听到的广播,并进行进一步的处理和操作。如果你想在虚拟的android世界中创建属于你自己的电台广播,那么就赶紧点击本集视频观看吧
android BroadcastReceiver 源码 学习
Intent和BroadcastReceiver示例代码
所谓广播机制是指,当触发一个事件时会做出相应的动作,比如说当别人发一条短信给你,然后BroadcastReceiver会监听这个事件(Intent),并判断用到了Intent中的Actiond的哪个BroadcastActions,如SMS_RECEIVED就是...
Android BroadcastReceiver
Android核心基础-9.Android四大组件之BroadcastReceiver-附件资源