Android中接收系统广播消息
来源:互联网 发布:阿里云网站更改负责人 编辑:程序博客网 时间:2024/05/16 00:25
Android的大量系统事件都会对外发送标准广播:
创建广播Action常量:
ACTION_TIME_CHANGED系统时间被改变
ACTION_DATE_CHANGED系统日期被改变
ACTION_TIMEZONE_CHANGED系统时区被改变
ACTION_BOOT_COMPLETED系统启动完成
ACTION_PACKAGE_ADDED系统添加包
ACTION_PACKAGE_CHANGED系统的包改变
ACTION_PACKAGE_REMOVED系统的包被删除
ACTION_PACKAGE_RESTARTED系统的包数据被重启
ACTION_PACKAGE_DATA_CLEARED系统的包数据被清空
ACTION_BATTERY_CHANGED电池电量改变
ACTION_BATTERY_LOW电池电量低
ACTION_POWER_CONNECTED系统连接电源
ACTION_POWER_DISCONNECTED系统与电源断开
ACTION_SHUTDOWN系统被关闭
1,开机自启动的Service
我们经常会有这样的应用场合,比如消息推送服务,需要实现开机启动的功能。
例如,监听用户来电,监听用户短信,拦截黑名单电话等
为了让Service随应系统启动自动执行,可以让BroadcastReceiver监听Action为ACTION_BOOT_COMPLETED常量的Intent,然后在BroadcastReceiver中启动特定的Service
LaunchReceiver.java
public class LaunchReceiver extends BroadcastReceiver { /* * 开机自启动的Service: * 例如,监听用户来电,监听用户短信,拦截黑名单电话等 * 为了让Service随应系统启动自动执行,可以让BroadcastReceiver监听Action为ACTION_BOOT_COMPLETED常量的Intent,然后在BroadcastReceiver中启动 * 特定的Service * * * */@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub Intent intent_to_service=new Intent(context,LaunchService.class); context.startService(intent_to_service);//广播里启动特定的Service}}LaunchService.java
public class LaunchService extends Service {@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}//Service被创建时回调该方法,可开发任意Service,监听用户来电,监听用户短信,拦截黑名单电话等等public void onCreate(){/*// 定义1秒执行一行输出new Timer().schedule(new TimerTask(){@Overridepublic void run(){System.out.println("-----"+ new Date() + "-----");}}, 0, 1000);*/Toast.makeText(this, "系统已开机", Toast.LENGTH_LONG).show();}}
<!-- 定义一个Broadcastreceiver,监听系统开机广播 --> <receiver android:name=".LaunchReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action><!-- 系统启动完成会发出此action的intent --> </intent-filter> </receiver> <service android:name=".LaunchService"></service>
<!--访问系统开机事件的权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2,短信提醒,系统接收到短信时,发送广播,在系统接收到短信之前,激发Broadcast
当系统收到短信时,系统会对外发出一个有序广播,该广播的Intent对应的Action为android.provider.Telephony.SMS_RECEIVED
因此只要在程序中开发一个对应的BroadcastReceiver即可监听到系统收到短信
SmsReceiver.java
package com.hust.smsreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.widget.Toast;/* * 短信提醒: * 当系统收到短信时,系统会对外发出一个有序广播,该广播的Intent对应的Action为android.provider.Telephony.SMS_RECEIVED * 因此只要在程序中开发一个对应的BroadcastReceiver即可监听到系统收到短信 * */public class SmsReceiver extends BroadcastReceiver { //当系统接收到短信是被触发,就是在系统自带的短信接收程序之前被触发,相当于拦截短信@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub //如果接收到短信if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){/*在系统短信接收程序之前会被启动,如果取消广播,那么短信广播将不会被传播到系统的短信接收程序,也就是系统本身将不会收到短信*///abortBroadcast();//取消广播,这行代码会让系统收不到短信StringBuilder sb=new StringBuilder();//短信数据捆绑在intent的Bundle中Bundle bundle=intent.getExtras();if(bundle!=null){//通过pdus可以获得接收到的所有短信消息Object[] pdus=(Object[]) bundle.get("pdus");//构建短信对象数组SmsMessage[] messages=new SmsMessage[pdus.length];for(int i=0;i<=pdus.length;i++){//根据pdus,把每个pdus转换成短信对象SmsMessagemessages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);}for(SmsMessage message:messages){sb.append("短信来源:");sb.append(message.getDisplayOriginatingAddress());//获取短信的源地址sb.append("\n----短信内容-----\n");sb.append(message.getDisplayMessageBody());//获取短信的内容}}Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();//toast消息提示}}}
<receiver android:name=".SmsReceiver"> <intent-filter android:priority="800"><!-- 优先级为800,在系统短信接受程序之前被触发 --> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter>
3,电量变化
如果我们阅读软件,可能是全屏阅读,这个时候用户就看不到剩余的电量,我们就可以为他们提供电量的信息。要想做到这一点,我们需要接收一条电量变化的广播,然后获取百分比信息,这听上去挺简单的
当手机电量发生改变是,系统会对外发送Intent的ActionACTION_BATTERY_CHANGED的常量的广播,
当手机电量过低时,会发送ACTION_BATTERY_LOW常量的广播
package com.hust.batteryreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.widget.Toast;public class BatteryReceiver extends BroadcastReceiver {/*当手机电量发生改变是,系统会对外发送Intent的ActionACTION_BATTERY_CHANGED的常量的广播, * 当手机电量过低只,会发送ACTION_BATTERY_LOW常量的广播 * * */@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stub Bundle bundle=intent.getExtras(); int current=bundle.getInt("level");//key=level是当前电量 int total=bundle.getInt("scale");//key=scale是总电量 //当前电量小于总电量的15% if(current*1.0/total<0.15){ Toast.makeText(context, "电池电量过低,请尽快充电!", Toast.LENGTH_LONG).show(); }}}
<receiver android:name=".BatteryReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_CHANGED"></action> </intent-filter> </receiver>
- Android中接收系统广播消息
- Android开发之接收系统广播消息
- Android开发之接收系统广播消息
- Android中BroadcastReceiver接收系统广播
- android-接收系统广播
- android接收系统广播
- Android广播接收 BroadcastReceiver监听系统全局的Broadcast消息
- Android演示如何接收广播消息
- android fragment间的广播消息接收
- Android 系列 4.7发送/接收广播消息
- 接收系统广播消息之监听系统开机
- Android接收不到系统广播的原因
- 接收系统广播消息之监听手机电量变化
- android接收adb发送的系统广播及自定义广播
- Android广播之接收系统广播(一)
- Android中短信的广播接收问题
- Android中广播注册与接收流程
- android 4.0 消息广播无法接收的原因
- BZOJ1002 无向联通图的生成树计数
- Linux上监控网络带宽的18个常用命令
- NSOperationQueue GCD NSThread总结
- 自己动手写一个简单的MVC框架(第一版)
- BZOJ-1878 HH的项链 树状数组+莫队(离线处理)
- Android中接收系统广播消息
- 剑指offer:17 合并两个排序的链表
- 换无线网卡
- HDU 2795 Billboard(线段树)
- 148 php namespace & use
- 一张图读懂sparkstreaming源码
- BZOJ_P3439 Kpm的MC密码(Trie树+主席树)
- 自己动手写一个简单的MVC框架(第二版)
- Python学习笔记(2)- Window 平台安装 Python