Android 四大组件_BroadcastReceiver

979 阅读3分钟
原文链接: www.haotianyi.win

简介

BroadcastReceiver的作用有些类似全局的事件监听器,当整个手机的某一个APP或者手机自身触发事件,BroadcastReceiver接受并且处理,而且这种信号程序自身也可以创建。

创建

创建BroadcastReceiver:

sp161102_022714

当BroadcastReceiver接受到全局的信号的时候就是回调onReceive方法,为了使

BroadcastReceiver能够正常的工作还要制定Intent

指定Intent

  • 代码指定
private MyReceiver mMyReceiver;
private IntentFilter mIntentFilter;
mIntentFilter = new IntentFilter("haotianyi.win.start");
mMyReceiver = new MyReceiver();
registerReceiver(mMyReceiver, mIntentFilter);//核心方法,还要取消注册
  • 在AndroidManifest中使用intent-filter标签指定Intent

sp161102_023959

发送广播

Intent intent = new Intent();
intent.setAction("haotianyi.win.start");
sendBroadcast(intent);

在onReceive方法中有这样一句话:

@Override
public void onReceive(Context context, Intent intent) {
    System.out.println("收到");
}

sp161102_024130

详细介绍

BroadcastReceiver有两种形式一种是有序广播也就是在接受的时候是按照顺序来接受的,高优先级先接受广播,而且可以中断广播和向广播中添加数据;另一种就是无序广播,当广播发出的时候所有的广播都可以接受,而且是同时接受的的,区别是两者的发送广播的方法不同。

有序广播

使用sendOrderedBroadcast来发送广播,也就是一种特殊的Intent(意图),中断广播的方法:abortBroadcast可以中断广播的继续发送。

广播的优先级是使用AndroidManifest中的priority属性,注意这个属性是放在intent-filter中的:

sp161102_024825

在上面的例子中在建立一个Broadcast,注意要使用sendOrderedBroadcast

sp161102_025528

传递数据

在不同的优先级中的广播传递数据:

更改MyService的onReceive方法:

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("收到");
        Bundle bundle = new Bundle();
        bundle.putString("nihao","你好");
        setResultExtras(bundle);
//        abortBroadcast();
    }

然后在更改MyService2的onReceive方法:

@Override
public void onReceive(Context context, Intent intent) {
    Bundle hello = getResultExtras(true);
    System.out.println("收到22"+"---------"+hello.get("nihao"));
}

打印截图:

sp161102_030000

注意两对方法: setResultExtras(bundle)和getResultExtras(true)

实战-短信拦截

注意这是在6.0版本之前的代码,6.0之后还要更多的权限(暂时不讨论)

首先就是把MyService能够接受系统的广播:

sp161102_030615

权限设置成最大的整数,然后在添加权限:

sp161102_030740

这时更改onService中的代码:

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("收到");
//        Bundle bundle = new Bundle();
//        bundle.putString("nihao","你好");
//        setResultExtras(bundle);
        abortBroadcast();
    }

这时当手机接受短信的是就完成拦截了

img

读取短信内容

Object[] objects = (Object[]) intent.getExtras().get("pdus");
for (Object object : objects) {// 短信最多140字节,
    // 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
    SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
    String originatingAddress = message.getOriginatingAddress();// 短信来源号码
    String messageBody = message.getMessageBody();// 短信内容
    System.out.println(originatingAddress + ":" + messageBody);
}

当再次接受短信:
sp161102_031046

无序广播

就是正常广播,使用方法就是sendBroadcast方法不同,二期不能中断广播;

作为一个全局的“监听者”,系统在很多任务都会发出广播,而且利用这个广播也可以作为跨进程通信的手段。

实例-开机自动启动

添加一个action:

sp161102_031934

然后在添加一个权限:

sp161102_031942

最后更改代码:

@Override
public void onReceive(Context context, Intent intent) {
    System.out.println("开机自动启动成功");
}

sp161102_031916

实战-手机电量过低

一个action:
sp161102_032357

一个权限:
sp161102_032405

一个结果:

sp161102_032459