##01_为什么需要广播接受者
电台:中央人民广播电台,93.4mhz;
收音机:93.4mhz,收听广播;
Android系统内置的电台,发送一些事件:接收短信、外拨电话、电量不足、电量充满、SD插拔、软件安装与下载等。
Android应用程序中的收音机:广播接收者,指定需要接收的事件类型;
可以做一些对用户有用的业务逻辑操作。
广播接收者的特点:
1、即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消息;
2、从android4.0之后,添加了一个新特点,如果强制停止就相当于冻结了这个程序,只能等到下次手工启动后才能生效;
##02_广播接受者案例_ip拨号器(重点)
17951 139999999
步骤:
1、准备一个收音机:
创建一个广播接收者的类,继承BroadcastReceiver:
public class OutCallBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
}
}
2、插上一块电池:
<receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver"></receiver>
3、调整到一定的频道:
<receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
4、添加权限到清单文件:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
##03_广播接受者案例_短信监听器(重点)
配置文件:
<receiver android:name="com.iheima.smslistener.SMSBroadcastReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
代码:
package com.iheima.smslistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接收短信的内容
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj : objs){
SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
String content = sms.getMessageBody();
String phone = sms.getOriginatingAddress();
System.out.println("content=="+ content);
System.out.println("phone=="+ phone);
}
}
}
##04_广播接受者案例_sd卡状态监听(重点)
android2.3的模拟器上测试,4.0之后的版本上去掉了SD插拔的功能;
从
代码:
* 配置文件:
<receiver android:name="com.itheima.sdlistener.SDBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<!-- 这个属性必须添加 -->
<data android:scheme="file"/>
</intent-filter>
</receiver>
* 代码:
package com.itheima.sdlistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SDBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//得到广播的事件类型
String action= intent.getAction();
if("android.intent.action.MEDIA_MOUNTED".equals(action)){
System.out.println("SD卡已经插上了............");
}
if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
System.out.println("SD卡已拔掉了............");
}
if("android.intent.action.MEDIA_REMOVED".equals(action)){
System.out.println("SD卡已经移除上了............");
}
}
}
##05_广播接受者案例_开机启动(重点)(代码不全)
配置文件:
<receiver android:name="com.itheima.bootcomplete.BootCompleteBroadcastReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
代码:
package com.itheima.bootcomplete;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
public class BootCompleteBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context,MainActivity.class);
//告诉activity使用自己的任务栈来维护界面,如果任务栈中没有当前任务就创建一个任务
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
##06_广播接受者案例_卸载安装(重点)
配置文件:
<receiver android:name="com.itheima.azxzlistener.AZXZBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<!-- 这个属性必须添加 -->
<data android:scheme="package"/>
</intent-filter>
</receiver>
代码:
package com.itheima.azxzlistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AZXZBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.PACKAGE_INSTALL".equals(action)){
System.out.println("有一个新软件安装了...........");
}
if("android.intent.action.PACKAGE_REMOVED".equals(action)){
System.out.println("有一个软件卸载了...........");
}
if("android.intent.action.PACKAGE_REPLACED".equals(action)){
System.out.println("有一个软件升级了...........");
}
}
}
##07_发送自定义广播
示例代码:
代码:
Intent intent = new Intent();
intent.putExtra("news", "我是广播");
//给广播设置一个事件类型
intent.setAction("com.itheima.selfbroadcast.SBC");
//发送广播消息
sendBroadcast(intent);
##08_有序广播和无序广播(重点)
有序广播:广播发送的消息会按照广播接收者的优先级从高到低一级一级的发放消息。
消息可以被拦截,被修改;
无序广播:广播发送的消息发送出去后,只要广播接收者指定了它的事件类型,都可以接收到这个消息。
消息不能被拦截;
代码:
Intent intent = new Intent();
intent.setAction("com.itheima.FFNTBT");
//发送一个有序的广播
//intent 传递数据的意图对象
//receiverPermission 指定了只有这个权限的广播接收者才能接收到这个消息
//resultReceiver 指定了哪个广播接收者最后接收到消息
//scheduler 消息处理器
//initialCode 初始的消息码
//initialData 初始数据
//initialExtras 发送的额外数据
sendOrderedBroadcast(intent, null, null, null, 1, "我是国务院,发放2014年农田补贴,每亩地补贴900元", null);
电台:中央人民广播电台,93.4mhz;
收音机:93.4mhz,收听广播;
Android系统内置的电台,发送一些事件:接收短信、外拨电话、电量不足、电量充满、SD插拔、软件安装与下载等。
Android应用程序中的收音机:广播接收者,指定需要接收的事件类型;
可以做一些对用户有用的业务逻辑操作。
广播接收者的特点:
1、即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消息;
2、从android4.0之后,添加了一个新特点,如果强制停止就相当于冻结了这个程序,只能等到下次手工启动后才能生效;
##02_广播接受者案例_ip拨号器(重点)
17951 139999999
步骤:
1、准备一个收音机:
创建一个广播接收者的类,继承BroadcastReceiver:
public class OutCallBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
}
}
2、插上一块电池:
<receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver"></receiver>
3、调整到一定的频道:
<receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
4、添加权限到清单文件:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
##03_广播接受者案例_短信监听器(重点)
配置文件:
<receiver android:name="com.iheima.smslistener.SMSBroadcastReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
代码:
package com.iheima.smslistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//接收短信的内容
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj : objs){
SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);
String content = sms.getMessageBody();
String phone = sms.getOriginatingAddress();
System.out.println("content=="+ content);
System.out.println("phone=="+ phone);
}
}
}
##04_广播接受者案例_sd卡状态监听(重点)
android2.3的模拟器上测试,4.0之后的版本上去掉了SD插拔的功能;
从
代码:
* 配置文件:
<receiver android:name="com.itheima.sdlistener.SDBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<!-- 这个属性必须添加 -->
<data android:scheme="file"/>
</intent-filter>
</receiver>
* 代码:
package com.itheima.sdlistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SDBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//得到广播的事件类型
String action= intent.getAction();
if("android.intent.action.MEDIA_MOUNTED".equals(action)){
System.out.println("SD卡已经插上了............");
}
if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
System.out.println("SD卡已拔掉了............");
}
if("android.intent.action.MEDIA_REMOVED".equals(action)){
System.out.println("SD卡已经移除上了............");
}
}
}
##05_广播接受者案例_开机启动(重点)(代码不全)
配置文件:
<receiver android:name="com.itheima.bootcomplete.BootCompleteBroadcastReceiver" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
代码:
package com.itheima.bootcomplete;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
public class BootCompleteBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context,MainActivity.class);
//告诉activity使用自己的任务栈来维护界面,如果任务栈中没有当前任务就创建一个任务
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
##06_广播接受者案例_卸载安装(重点)
配置文件:
<receiver android:name="com.itheima.azxzlistener.AZXZBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<!-- 这个属性必须添加 -->
<data android:scheme="package"/>
</intent-filter>
</receiver>
代码:
package com.itheima.azxzlistener;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class AZXZBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.PACKAGE_INSTALL".equals(action)){
System.out.println("有一个新软件安装了...........");
}
if("android.intent.action.PACKAGE_REMOVED".equals(action)){
System.out.println("有一个软件卸载了...........");
}
if("android.intent.action.PACKAGE_REPLACED".equals(action)){
System.out.println("有一个软件升级了...........");
}
}
}
##07_发送自定义广播
示例代码:
代码:
Intent intent = new Intent();
intent.putExtra("news", "我是广播");
//给广播设置一个事件类型
intent.setAction("com.itheima.selfbroadcast.SBC");
//发送广播消息
sendBroadcast(intent);
##08_有序广播和无序广播(重点)
有序广播:广播发送的消息会按照广播接收者的优先级从高到低一级一级的发放消息。
消息可以被拦截,被修改;
无序广播:广播发送的消息发送出去后,只要广播接收者指定了它的事件类型,都可以接收到这个消息。
消息不能被拦截;
代码:
Intent intent = new Intent();
intent.setAction("com.itheima.FFNTBT");
//发送一个有序的广播
//intent 传递数据的意图对象
//receiverPermission 指定了只有这个权限的广播接收者才能接收到这个消息
//resultReceiver 指定了哪个广播接收者最后接收到消息
//scheduler 消息处理器
//initialCode 初始的消息码
//initialData 初始数据
//initialExtras 发送的额外数据
sendOrderedBroadcast(intent, null, null, null, 1, "我是国务院,发放2014年农田补贴,每亩地补贴900元", null);