物联网(IoT)开发入门教程:BroadCastReciever学习

BroadCastReciever是什么

在安卓系统中有很多的事件,比如接收到短信,网络状态改变,地理位置改变等等…安卓系统都会发出一个广播。不过就像收音机需要调到合适的频段才能接受到广播一样,在安卓系统中,需要注册广播之后才能接受到广播。

接下来,我们来看看如何接受一个广播,如何发送一个广播。

接受一个广播

新建一个工程:ReceiveBroadCast。我们现在manifest文件里添加接受短信的权限(android.permission.RECEIVE_SMS),如下:

 

接着,我们在MainActivity中创建一个类,这里起名叫SMSReceiver,继承BroadcastReceiver。

public class SMSReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(SMS_RECIVED_ACTION)) {
System.out.println(“收到了短信”);
}
}
}

在我们定义的SMSReceiver中,有一个onReceive方法,当我们接受到广播时,就会调用这个方法。一个广播接受者可以接受监听多个事件,都会保存在intent的action属性里面,可以通过intent.getAction来获取事件的名称判断。

private static final String SMS_RECIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
SMSReceiver receiver;

然后我们把receiver声明成类中的变量,我们需要在onCreate的时候注册这个广播(注意接受短信权限属于危险权限,需要向用户申请)。

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mayRegisterReceiver();
}

void doRegisterReceiver() {
isRegistered = true;
//添加一个IntentFilter,用来过滤SMS_RECIVED_ACTION这个事件。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SMS_RECIVED_ACTION);

receiver = new SMSReceiver();
registerReceiver(receiver, intentFilter);//注册广播
}

这里用到了一个IntentFilter对象,翻译一下可以理解为Intent过滤器,就是把SMS_RECIVED_ACTION给筛选出来。注册之后,当系统有SMS_RECIVED_ACTION事件发生时,就会调用SMSReceiver的onReceive方法了。

另外,我们需要在onDestroy方法中解除注册,完整的代码如下:

package com.example.kalen.receivebroadcast;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private static final String SMS_RECIVED_ACTION = “android.provider.Telephony.SMS_RECEIVED”;
private static final int SMS_REQ_CODE = 101;

boolean isRegistered = false;
SMSReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mayRegisterReceiver();
}

@Override
protected void onDestroy() {
super.onDestroy();
if (isRegistered) {
unregisterReceiver(receiver); //解除注册
}
}

private void mayRegisterReceiver() {
if (Build.VERSION.SDK_INT >= 23) {
int grant = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
if(grant != PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)){
Toast.makeText(this, “需要接受短信权限”, Toast.LENGTH_SHORT).show();
}
ActivityCompat.requestPermissions(this ,new String[]{Manifest.permission.RECEIVE_SMS}, SMS_REQ_CODE);
}else{
doRegisterReceiver();
}
} else {
doRegisterReceiver();
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == SMS_REQ_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, “获取权限成功”, Toast.LENGTH_LONG).show();
doRegisterReceiver();
} else {
Toast.makeText(this, “没有权限接受短信”, Toast.LENGTH_LONG).show();
}
}
}

void doRegisterReceiver() {
isRegistered = true;
//添加一个IntentFilter,用来过滤SMS_RECIVED_ACTION这个事件。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SMS_RECIVED_ACTION);

receiver = new SMSReceiver();
registerReceiver(receiver, intentFilter);//注册广播
}

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECIVED_ACTION)) {
System.out.println(“收到了短信”);
}
}
}
}

代码编写完成后,把程序先运行起来,并同意一下监听短信的权限。

这时候,我们需要模拟一个短信发送事件,我们打开DDMS,在上方有一个Emulator的选项,我们选中它,我们可以看到这里可以模拟打电话、发短信以及设置经纬度等等。

打电话和发短信需要填写一个电话号码,填写之后,可以看到就已经可以发短信了。

点击“Send”,可以看到LogCat上显示出了短信提示。

同时,也可以看到模拟器上的通知栏里的短信提示。

发送一个广播

知道怎么接受广播之后,我们来看看如何发送一个广播。其实发送一个广播更加的简单,使用sendBroadcast这个函数,把一个intent传过去就好了。我们新建一个工程:SendBroadCast,添加一个Button,当我们点击这个Button,就发送一个广播,并创建一个MyReceiver来接受这个广播。代码十分简单,这里就直接贴代码了:

package com.example.kalen.sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {
MyReceiver receiver;
private static final String MY_ACTION = “自己定义的Action”; //随便取一个名字

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(MY_ACTION);
sendBroadcast(intent); //发送MY_ACTION
}
});

IntentFilter filter = new IntentFilter();
filter.addAction(MY_ACTION);

receiver = new MyReceiver();
registerReceiver(receiver, filter);
}

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver); //解除注册
}

public class MyReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MY_ACTION)) {
System.out.println(“接收到MY_ACTION”);
}
}
}

}

点击Button之后,可以看到打印出的调试信息。

到这里,Android的部分也算基本讲解完了,Service和BroadcastReceiver相关的内容的例子可能稍微虚了一些。读者可以先学习第五章的蓝牙开发实战环节,在5.4节将要讲解蓝牙4.0的例程源码,结合实际的源码,希望能让读者对这两个安卓基本组件有更深的了解,同时,也能够掌握蓝牙4.0开发的技巧。

相关推荐

IT/互联网岗位招聘计划-AT阿宝哥

《Oracle JavaEE编程指南》01-02:HTTP协议

CentOS7.4 rpm方式安装docker

【SpringBoot 系列】史上最全的springboot学习教程(会不断更新)

在这里插入图片描述

小白终是踏上了这条不归路—-小文的mysql学习笔记(3)—-排序查询