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"/>



1 0