Android 广播BroadcastReceiver基础----重新认识Android(13)

来源:互联网 发布:手机文字编辑软件 编辑:程序博客网 时间:2024/06/16 00:57
* 广播接收者创建的步骤:
* 1. 创建BroadcastReceiver的子类;
* 2. 实现 onReceive() 方法;
* 3. 确定接收哪些类型的广播
*
* 3.1 接收的广播实际上,就是 Intent,其中包含 action
* 3.2 action 就是广播的类型
*ACTION_BATTERY_CHANGED----电池广播
* 4. 在清单文件或者代码中 进行注册,接收指定的广播;
*
* 4.1 在清单文件中,把 action 注册上就可以接收指定的广播了

// 广播接收者可以使用 abortBroadcast() 方法来终止广播的继续传递
abortBroadcast();

* 当广播接收者,接收到广播消息的时候,
* 会自动回调这个方法
*
* Intent 参数就是广播的信息
public void onReceive(Context context, Intent intent)

// 1. 常量内容,代表网络发生变化的广播类型
// android.net.conn.CONNECTIVITY_CHANGE
//ConnectivityManager.CONNECTIVITY_ACTION

// 2. 当 网络发生变化,onReceive 就会被执行

// 3. 检测网络状态
// 3.1 获取网络连接的管理器
// 需要访问网络状态的权限
ConnectivityManager manager =
(ConnectivityManager)
context.getSystemService(
Context.CONNECTIVITY_SERVICE
);

// 3.2 获取当前的网络连接信息
NetworkInfo info = manager.getActiveNetworkInfo();
if(info != null){
// 代表有网络连接

// 获取网络类型 支持手机、WiFi、蓝牙
int type = info.getType();

// 详细的网络类型
int subtype = info.getSubtype();

// 使用 ConnectivityManager 中 TYPE_XXX 常量
// 可以判断网络的类型

switch (type){
case ConnectivityManager.TYPE_MOBILE:
Log.d("Receiver", "手机网络");
break;
case ConnectivityManager.TYPE_WIFI:
Log.d("Receiver", "WiFi");
break;
}

}else{
// 代表没有网络连接
Log.d("Receiver", "无连接");
}
接收短信的广播--------------------------------------------
* 接收短信的广播,短信广播是有序广播,一个接收者处理完成之后
* 下一个接收者才会收到广播;
* 1. 创建接收者
* 2. 确认接收的广播的action; android.provider.Telephony.SMS_RECEIVED
* 3. 静态注册
* 4. 需要声明权限:接收短信的权限
public void onReceive(Context context, Intent intent)
// 接收短信
// 短信的数据全部保存在 intent中;
// 保存的数据是一个对象数组,内部真实的数据是 二维数组;
// 数据的 key 是 "pdus"
Bundle b = intent.getExtras();

// 获取收到的短信数据
Object obj = b.get("pdus");

Log.d("MessageReceiver", "obj = " + obj);

// 处理短信的数据结构

byte[][] data = (byte[][]) obj;

// 二维数组中,每一个数组元素,就是一个短信的数据

for (byte[] pdu : data) {
// pdu 是短信规范中的格式,Android 可以直接使用API来获取短信内容
SmsMessage msg = SmsMessage.createFromPdu(pdu);

// 获取发件人
String address = msg.getDisplayOriginatingAddress();

// 获取短信文本内容;
String body = msg.getDisplayMessageBody();

// 短信黑名单 根据 address 来处理

Log.d("MessageReceiver", address+"->"+body);

}
// 广播接收者可以使用 abortBroadcast() 方法来终止广播的继续传递
abortBroadcast();
有序无序广播----------------------------------------------------------
<!-- 接收短信的权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

<receiver android:name=".MessageReceiver">
<!--
一定要注意,短信接收者必须要设置优先级,
否则就接收不到短信,优先级最高 1000
-->
<intent-filter android:priority="1000">

<!-- 接收短信,需要声明权限 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

public void sendNormalBroadcast(View view) {
// 发送无序广播,参数 Intent 就是 广播接收者收到的Intent
// Intent 中必须设置 action
// action 可以自定义
Intent intent = new Intent("com.qianfeng.brdemo.ACTION_1");
// Intent 中的 action 参数,
// 就是 广播接收者需要声明的 那个 action 属性的值
sendBroadcast(intent);
}
public void sendOrderedBroadcast(View view) {
// 发送有序的广播
Intent intent = new Intent("com.qianfeng.brdemo.ACTION_1");
// 参数1: 广播的数据 Intent
// 参数2: 有序广播设置的接收者权限;如果权限设置为
// null 代表不检查权限;
// 如果设置字符串,那么广播接收者同样必须设置权限属性
sendOrderedBroadcast(intent, null);
}
public void sendSticky(View view){
//sendStickyBroadcast();
}
// 能够终止有序广播的传递;
// 如果收到的广播是无序的,那么这个方法没有作用
// 如果广播消息是无需的,那么abortBroadcast内部会打印一个异常;
// 不会影响代码逻辑
---开机自启动-------------------------------------------------------
<!-- 用于接收启动广播的 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<!--
接收手机启动成功之后,发送的广播消息
用于自动启动程序:通常启动的就是程序的服务;
自动启动需要设置权限
-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
/**
* 实现开机自动启动(根据手机不同,效果不同)
* 1. 创建接收者
* 2. 确认开机启动的 ACTION
* 3. 静态注册
* 4. 需要设置开机启动权限
*/
public class BootReceiver extends BroadcastReceiver {
public BootReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// 开机启动的ACTION
// Intent.ACTION_BOOT_COMPLETED;
// 使用存储卡挂载也可以实现自动启动程序
//Intent.ACTION_MEDIA_MOUNTED
Log.d("BootReceiver", "手机启动了,我也被调用了");
}
}

0 0