Android 广播机制(二
来源:互联网 发布:易语言json解析教程 编辑:程序博客网 时间:2024/03/28 19:55
三、接收系统广播: 广播接收器最大的用途就是接受系统发出的消息。例如:截获短信,截获来电等等。
(一)、短信拦截:
primary data user station (PDUS 主数据用户站)
Protocol Data Unit (协议数据单元)
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "==来短信了", Toast.LENGTH_LONG).show();
// 获取短信的具体信息
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] smsMessages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
smsMessages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
//获取电话号码
String phoneNumber = null; //获取短信内容
String msg = null;
StringBuilder builder = new StringBuilder();
for (SmsMessage message : smsMessages) {
phoneNumber = message.getDisplayOriginatingAddress();
msg = message.getDisplayMessageBody(); builder.append(msg);
}
Log.i("123","短信:phone-->" + phoneNumber + "msg-->" + builder.toString());
abortBroadcast();
}
<receiver
android:name=".MySmsReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" >
</action>
</intent-filter>
</receiver>
<!-- 申请接受短消息的权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
(二)、来去电监听:
public void onReceive(Context context, Intent intent) {
String phoneNumber = null;
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
// 拨打电话
phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i("123", "拨打的电话号码:" + phoneNumber);
} else {
TelephonyManager manager = (TelephonyManager) context
.getSystemService(Service.TELEPHONY_SERVICE);
Bundle bundle = intent.getExtras();
// 来电电话
phoneNumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
int state = manager.getCallState();
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 铃声响动
Log.i("123", "==铃声响了" + phoneNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 电话接听
Log.i("123", "==接听电话" + phoneNumber);
break;
case TelephonyManager.CALL_STATE_IDLE:// 挂电话了
Log.i("123", "==电话挂了" + phoneNumber);
break;
default:
break;
}
}
<!-- 监听电话 -->
<receiver android:name="com.qianfeng.sysreceiver.CallPhoneReceiver">
<intent-filter >
<!-- 电话往外打(去电)的频道 -->
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<!-- 打来的电话(来电)的频道 -->
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
<!-- 申请打电话权限 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<!-- 申请接听电话权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
(三)、截获屏幕休眠与唤醒:
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
Log.i("123", "==屏幕休眠了");
}
if (action.equals(Intent.ACTION_SCREEN_ON)) {
Log.i("123", "==屏幕唤醒了");
}
if (action.equals(Intent.ACTION_USER_PRESENT)) {
Log.i("123", "==屏幕已解锁");
}
}
【动态注册】
ScreenOffOnReceiver myReceiver = new ScreenOffOnReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(myReceiver, filter);
【备注】屏幕唤醒和休眠广播只能在代码中注册,如果在清单配置文件中注册将不起作用
(四)、开机自动运行:
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "监听到开机了", Toast.LENGTH_LONG).show();
Intent intent2 = new Intent(context, MainActivity.class);
//构建新的Activity任务栈
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent2);
}
<receiver
android:name=".LaunchReceiver"
android:enabled="true" android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- 开机的权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
(五)、手机电池当前电量:
public void onReceive(Context context, Intent intent) {
// 获取当前广播Action
String action = intent.getAction();
/ 电池电量改变
/ 低电量Intent.ACTION_BATTERY_LOW
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
// 获取当前电量信息
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
// 获取电量最大值
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
Log.i("123", "当前电量==" + level);
Log.i("123", "电量最大值==" + scale);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
switch (status) {
case BatteryManager.BATTERY_STATUS_UNKNOWN:
Log.i("123", "电池状态-->未知状态");
break;
case BatteryManager.BATTERY_STATUS_CHARGING:
Log.i("123", "电池状态-->正在充电");
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
Log.i("123", "电池状态-->放电中");
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
Log.i("123", "电池状态-->未充电");
break;
case BatteryManager.BATTERY_STATUS_FULL:
Log.i("123", "电池状态-->电池满");
break;
default:
break;
}
/ int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH, -1);
/ BATTERY_HEALTH_COLD 电池冷却
/ BATTERY_HEALTH_DEAD 电池没电
/ BATTERY_HEALTH_GOOD 电池良好
/ BATTERY_HEALTH_OVERHEAT 电池过热
/ BATTERY_HEALTH_OVER_VOLTAGE 过电压
/ BATTERY_HEALTH_UNKNOWN 未知原因
/ BATTERY_HEALTH_UNSPECIFIED_FAILURE 未定义错误
}
}
【备注】动态注册电池电量的接收器
batteryReceiver = new BatteryReceiver();
IntentFilter filter2 = new IntentFilter();
filter2.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver, filter2);
<!-- 电池电量状态的权限 -->
<uses-permission android:name="android.permission.BATTERY_STATS"/>
- android 广播机制二
- Android 广播机制(二
- Android广播机制二
- Android广播发送机制剖析【android广播系列二】
- Android笔记(二十四)广播机制
- Android 广播内部机制详解(二)
- Android中的广播机制(二)----- 发送广播
- 广播机制(二)
- Android深入浅出系列之广播机制—Android中的广播机制(二)
- [Android]Android广播机制
- Android广播机制实现源码浅析(二)
- Android退出程序(二)——利用广播机制
- Android广播机制实现源码浅析(二)
- android 广播机制
- Android--广播机制
- Android 广播机制
- android 广播机制
- Android 广播机制 详解
- CodeBlocks简易教程--共同学习进步
- HDU 1220 Cube
- UC远程调试
- 23种设计模式UML
- Packet for query is too large(mysql写入数据过大)
- Android 广播机制(二
- android AES加密 --java
- Mac OS X 命令行用户应当知道的八个终端工具
- androd中显示listview的dialog,并实现listview的点击事件
- 正则表达式-检测是否是2到4位汉字
- 在VC中如何将文件保存为EXCEL格式
- 技术框架积累2
- windows上安装myeclipse2014,链接+破解地址
- 谈项目经理与产品经理的工作范围及差别?