Android monitor the plug/unplug of USB
2015-08-17 10:25
519 查看
暂时无法工作。
1.最近在做项目中遇到一个需要监控USB拔插来关闭服务的问题,当时查了不少资料,都是说android3.0以上的USB类可以监控,╮(╯▽╰)╭比较难搞后来发现其实可以变通的监控外部电源来实现,相当于监控USB了呵呵,记录下来Intent.ACTION_POWER_DISCONNECTED就是它了
2./article/5259258.html
AndroidManifest.xml
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
判断当前充电状态
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。
因为这是一个stickyintent,你不需要注册广播接收器。简单地通过调用registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
复制代码代码如下:
IntentFilterifilter=newIntentFilter(Intent.ACTION_BATTERY_CHANGED);
IntentbatteryStatus=context.registerReceiver(null,ifilter);
//你可以读到充电状态,如果在充电,可以读到是usb还是交流电
//是否在充电
intstatus=batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||
status==BatteryManager.BATTERY_STATUS_FULL;
//怎么充
intchargePlug=batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
booleanusbCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_USB;
booleanacCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_AC;
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
监听充电状态的改变
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。
充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED作为过滤。
复制代码代码如下:
<receiverandroid:name=".PowerConnectionReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<actionandroid:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
复制代码代码如下:
publicclassPowerConnectionReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
intstatus=intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||
status==BatteryManager.BATTERY_STATUS_FULL;
intchargePlug=intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
booleanusbCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_USB;
booleanacCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_AC;
}
}
判断当前剩余电量
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:
复制代码代码如下:
//当前剩余电量
intlevel=batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL,-1);
//电量最大值
intscale=batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE,-1);
//电量百分比
floatbatteryPct=level/(float)scale;
注:暂时不知道为什么要这样算,在我自己的机器上运行,scale就是100的。
监听剩余电量显著改变
持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
复制代码代码如下:
<receiverandroid:name=".BatteryLevelReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.ACTION_BATTERY_LOW"/>
<actionandroid:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。文章链接:http://www.jb51.net/article/51557.htm
1.最近在做项目中遇到一个需要监控USB拔插来关闭服务的问题,当时查了不少资料,都是说android3.0以上的USB类可以监控,╮(╯▽╰)╭比较难搞后来发现其实可以变通的监控外部电源来实现,相当于监控USB了呵呵,记录下来Intent.ACTION_POWER_DISCONNECTED就是它了
2.
USBBroadcastReceiver.java
1packagecom.example.communication; 2 3importandroid.content.BroadcastReceiver; 4importandroid.content.Context; 5importandroid.content.Intent; 6importandroid.widget.Toast; 7 8publicclassUSBBroadcastReceiverextendsBroadcastReceiver{ 9@Override 10publicvoidonReceive(Contextcontext,Intentintent){ 11//TODOAuto-generatedmethodstub 12if(intent.getAction().equals("android.hardware.usb.action.USB_STATE")){ 13if(intent.getExtras().getBoolean("connected")){ 14//usb插入 15Toast.makeText(context,"插入",Toast.LENGTH_LONG).show(); 16}else{ 17//usb拔出 18Toast.makeText(context,"拔出",Toast.LENGTH_LONG).show(); 19} 20} 21} 22}
AndroidManifest.xml
1<receiverandroid:name=".USBBroadcastReceiver"> 2<intent-filterandroid:priority="800"> 3<actionandroid:name="android.hardware.usb.action.USB_STATE"/> 4</intent-filter> 5</receiver>
Android中检查、监听电量和充电状态的方法
当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。
电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。
类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。
注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。
判断当前充电状态
通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。
因为这是一个stickyintent,你不需要注册广播接收器。简单地通过调用registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。
复制代码代码如下:
IntentFilterifilter=newIntentFilter(Intent.ACTION_BATTERY_CHANGED);
IntentbatteryStatus=context.registerReceiver(null,ifilter);
//你可以读到充电状态,如果在充电,可以读到是usb还是交流电
//是否在充电
intstatus=batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||
status==BatteryManager.BATTERY_STATUS_FULL;
//怎么充
intchargePlug=batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
booleanusbCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_USB;
booleanacCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_AC;
通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。
监听充电状态的改变
充电状态很容易改变(插入/拔出充电器),所以监听充电状态,更改刷新频率很重要。
充电状态改变时,BatteryManager会发一个广播。接收这些事件很重要,甚至在应用没有运行的时候,因为可能你需要后台开启更新服务。所以,在Androidmanifest.xml里注册广播接收器,加上两个action:ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED作为过滤。
复制代码代码如下:
<receiverandroid:name=".PowerConnectionReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<actionandroid:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
在关联的广播接收器实现里,你可以读出当前充电状态,方法跟上一步说的相同:
复制代码代码如下:
publicclassPowerConnectionReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
intstatus=intent.getIntExtra(BatteryManager.EXTRA_STATUS,-1);
booleanisCharging=status==BatteryManager.BATTERY_STATUS_CHARGING||
status==BatteryManager.BATTERY_STATUS_FULL;
intchargePlug=intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,-1);
booleanusbCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_USB;
booleanacCharge=chargePlug==BatteryManager.BATTERY_PLUGGED_AC;
}
}
判断当前剩余电量
在某些案例里,判断当前剩余电量同样很有用。如果电量在某些水平之下,你可能会选择降低后台更新频率。
你可以用下面的代码读到电量:
复制代码代码如下:
//当前剩余电量
intlevel=batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL,-1);
//电量最大值
intscale=batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE,-1);
//电量百分比
floatbatteryPct=level/(float)scale;
注:暂时不知道为什么要这样算,在我自己的机器上运行,scale就是100的。
监听剩余电量显著改变
持续监听电池状态不容易,但你不必这么做。
一般来说,持续监听电池电量对电池的影响比app的正常行为还要大。所以,只监听剩余电量的指定级别的改变(进入或离开低电量状态)是一个很好的实践。
manifest里声明的接收器,会在进入或离开低电量状态时触发。
复制代码代码如下:
<receiverandroid:name=".BatteryLevelReceiver">
<intent-filter>
<actionandroid:name="android.intent.action.ACTION_BATTERY_LOW"/>
<actionandroid:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>
剩余电量严重不足时,最好禁用所有后台更新。在你可以使用手机之前就关机了,这种情况下,如果刷新数据并不重要。
在很多情况下,设备是是插入到底座里充电的(好吧,反正我没见几个人额外花钱买底座的,可能国外较多)。下节讲怎么判断当前底座状态和监听插入底座时改变。文章链接:
相关文章推荐
- Android 禁止横竖屏切换,onConfigurationChanged的作用
- Android的CPP代码都加了namespace android
- ArcGIS Runtime SDK for Android 各版本下载地址
- Android开发常见问题
- phonegap(cordova) 入门 2----使用Crosswalk 统一android 下 cordova运行的环境
- Android中为TextView中的部分文字设置颜色和点击事件
- Android性能优化典范(三)
- Android中多个Actvity之间传值实现
- 学习笔记001之[Android开发视频教学].01_06_Android当中的常见控件
- Android MD5加密算法
- Android 自定义圆形进度条
- Android系统-基于Android2.3.5系统:JNI与HAL实例解析[一]
- Linerlayout(线性布局)
- Android 锁屏 相关
- Android textview 不使用ScrollView也可滚动的方法
- Android SDK tools 国内下载地址
- android模拟器重启防止恢复重置,永久删除系统应用apk
- Android友盟判断手机是否存在微博客户端
- Android开发自学笔记(Android Studio1.3.1)—2.开始第一个Android应用
- android问题及其解决-优化listView卡顿和如何禁用ListView的fling