- 浏览: 231597 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wsygyb:
收不到广播,您有测试过吗????
跨应用(跨进程)发送广播和接收广播 -
jun117117:
收不到广播,有能收到广播的例子帮忙分享下吧:jun117117 ...
跨应用(跨进程)发送广播和接收广播 -
u012398365:
查了好多资料都是说这样实现,但就是收不到广播,楼主知道原因不? ...
跨应用(跨进程)发送广播和接收广播 -
vigiles:
sendOrderedBroadcast(i, null,其它 ...
跨应用(跨进程)发送广播和接收广播 -
tangyunliang:
//直接拨打 Log.d(TAG, &quo ...
安卓 拨号界面和直接拨打界面
在做一个显示电池电量的窗口小部件,看到这篇文章,很不错。转一下。原文链接:http://hi.baidu.com/maoxiaofei_2009/blog/item/39f147894b162518c8fc7a97.html
电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。BatteryService是跑在system_process当中,在系统初始化的时候启动,如下
在BatteryService.java中:
Log.i(TAG, "Starting Battery Service."); BatteryService battery = new BatteryService(context); ServiceManager.addService("battery", battery);
1. 数据来源
BatteryService通过JNI(com_android_server_BatteryService.cpp)读取数据。BatteryService通过JNI注册的不仅有函数,还有变量。 如下:
在BatteryService.java中声明的变量
private boolean mAcOnline; private boolean mUsbOnline; private int mBatteryStatus; private int mBatteryHealth; private boolean mBatteryPresent; private int mBatteryLevel; private int mBatteryVoltage; private int mBatteryTemperature; private String mBatteryTechnology;
在BatteryService.java中声明的变量,在com_android_server_BatteryService.cpp中共用,即在com_android_server_BatteryService.cpp中其实操作的也是BatteryService.java中声明的变量
gFieldIds.mAcOnline = env->GetFieldID(clazz, "mAcOnline", "Z"); gFieldIds.mUsbOnline = env->GetFieldID(clazz, "mUsbOnline", "Z"); gFieldIds.mBatteryStatus = env->GetFieldID(clazz, "mBatteryStatus", "I"); gFieldIds.mBatteryHealth = env->GetFieldID(clazz, "mBatteryHealth", "I"); gFieldIds.mBatteryPresent = env->GetFieldID(clazz, "mBatteryPresent", "Z"); gFieldIds.mBatteryLevel = env->GetFieldID(clazz, "mBatteryLevel", "I"); gFieldIds.mBatteryTechnology = env->GetFieldID(clazz, "mBatteryTechnology", "Ljava/lang/String;"); gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, "mBatteryVoltage", "I"); gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, "mBatteryTemperature", "I");
上面这些变量的值,对应是从下面的文件中读取的,一只文件存储一个数值。
#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online" #define USB_ONLINE_PATH "/sys/class/power_supply/usb/online" #define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status" #define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health" #define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present" #define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity" #define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol" #define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp" #define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"
Android是运行在Linux内核上面的,/sys/class/power_supply亦是Linux内核下面的目录。至于这些文件时怎么生成的,则是由Platform来控制的。
2. 数据传送
电池的这些信息是通过何种方式,被其他应用所获得的。可以想到的有两种方式,第一种,应用主动从BatteryService获得数据;第二种,BatteryService主动把数据传送给所关心的应用程序。
BatteryService采用的是第二种方式,所有的电池的信息数据是通过Intent传送出去的。在BatteryService.java中,Code如下:
BatteryService采用的是第二种方式,所有的电池的信息数据是通过Intent传送出去的。在BatteryService.java中,Code如下: Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); intent.putExtra("status", mBatteryStatus); intent.putExtra("health", mBatteryHealth); intent.putExtra("present", mBatteryPresent); intent.putExtra("level", mBatteryLevel); intent.putExtra("scale", BATTERY_SCALE); intent.putExtra("icon-small", icon); intent.putExtra("plugged", mPlugType); intent.putExtra("voltage", mBatteryVoltage); intent.putExtra("temperature", mBatteryTemperature); intent.putExtra("technology", mBatteryTechnology); ActivityManagerNative.broadcastStickyIntent(intent, null);
3. 数据接收
应用如果想要接收到BatteryService发送出来的电池信息,则需要注册一个Intent为Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。
注册方法如下:
IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); registerReceiver(mIntentReceiver, mIntentFilter); private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { int nVoltage = intent.getIntExtra("voltage", 0); if(nVoltage!=0){ mVoltage.setText("V: " + nVoltage + "mV - Success..."); } else{ mVoltage.setText("V: " + nVoltage + "mV - fail..."); } } } };
4. 数据更新
电池的信息会随着时间不停变化,自然地,就需要考虑如何实时的更新电池的数据信息。在BatteryService启动的时候,会同时通过UEventObserver启动一个onUEvent Thread。
每一个Process最多只能有一个onUEvent Thread,即使这个Process中有多个UEventObserver的实例。当在一个Process中,第一次Call startObserving()方法后,这个UEvent thread就启动了。
而一旦这个UEvent thread启动之后,就不会停止。
//在BatteryService.java中 mUEventObserver.startObserving("SUBSYSTEM=power_supply"); private UEventObserver mUEventObserver = new UEventObserver() { @Override public void onUEvent(UEventObserver.UEvent event) { update(); } };
在UEvent thread中会不停调用 update()方法,来更新电池的信息数据。
5. 附录相关文件:
(1). SystemServer.java (frameworks\frameworks\base\services\java\com\android\server)
(2). BatteryService.java (frameworks\frameworks\base\services\java\com\android\server)
(3). UEventObserver.java (frameworks\frameworks\base\core\java\android\os)
(4). com_android_server_BatteryService.cpp (frameworks\frameworks\base\services\jni)
发表评论
-
BroadcastReceiver中的耗时操作
2013-11-11 18:30 5598在BroadcastReceiver中接收到广播之后,有时 ... -
工作线程(后台线程)内操作UI线程(主线程)的方法汇集
2013-11-11 18:20 1423Activity.runOnUiThread(Runna ... -
android获取手机联系人,非SIM卡联系人,联系人账户概念
2013-10-30 17:52 7352最近在做一个项目,需要只显示手机联系人,不显示SIM卡联系 ... -
Android Checkbox自定义背景bug
2013-10-28 17:09 48141,Checkbox 设置完button属性后,文本和but ... -
启动其他应用的activity
2013-08-30 15:23 1676启动其他应用的activity,只需要两个东西。该应用的包 ... -
SIM卡ICCID标识与IMSI的区别
2013-05-28 10:21 13896ICCID:Integrate circui ... -
The method show(FragmentManager, String) in the type DialogFragment is not appli
2013-04-17 16:06 5364The method show(FragmentManag ... -
跨应用(跨进程)发送广播和接收广播
2013-03-16 10:36 20870跨应用发送和接收广播,与同应用下的情况差不多,只需要添加一 ... -
android 检查GPS是否开启,打开GPS设置界面
2012-10-07 12:44 7403转自http://iriverman.iteye.com/bl ... -
android自带图标
2012-09-25 15:08 960安卓自带的图标,可以直接拿来用的,分享下 http:/ ... -
安卓 拨号界面和直接拨打界面
2012-09-18 10:59 6751/** *打电话 * * @para ... -
android 移除remove元素
2012-08-30 09:34 1945移除某个元素,用 ((ViewManager) (vi ... -
View not attached to window manager
2012-08-29 15:32 2775转载 今天在写程序中遇到如下问题,如此怪异,在网上找了很 ... -
.如何计算两点之间距离
2012-08-28 15:41 3884——摘自百度地图http://dev.baidu.com/ ... -
[androidpn通信] 『bug』客户端断网或者关机,服务器端session没关闭
2012-08-14 16:42 5057客户端断网或者关机,服务器端session没关闭的解决方案: ... -
Android开发:判断sdCard是否已安装的两种方法
2012-06-21 13:37 1123第一种方法是常用的通过判断ExternalStorageS ... -
Android标题栏各种设置
2012-06-20 14:25 15801、隐藏标题栏requestWindowFeature(Win ... -
利用Sensor实现android手机类似于微信摇一摇
2012-06-11 15:36 1682传感器有几种类型:方向传感器: Sensor.TYPE_O ... -
从android系统图库中取图片的代码
2012-06-11 14:26 1336该文章转载自 http://marshal.easymor ... -
surfaceView 清空canvas的一种方式
2012-06-04 23:41 6120canvas.drawColor(Color.TRANS ...
相关推荐
在Android系统中,获取电池电量信息是通过BatteryService这一核心服务来实现的。BatteryService是一个系统级别的服务,它运行在system_process进程中,并在系统启动时由SystemServer初始化并启动。在`SystemServer....
实现一个电池属性实时监听器。这些属性包括温度,电池电量.......而且,使用Service,Broadcast,以及Thread的方式来实现。MyBatteryService后台获取Battery属性值,然后,在Activity中进行相关数据的显示。
BatteryService 是android中提供电源管理的类(Android 4.1.2)
"Android应用源码battery(电池)监控程序.zip"提供了一种实现电池状态监控的方法,这可以帮助开发者了解应用对电池寿命的影响,优化应用性能,或者创建专门的电池管理工具。下面,我们将深入探讨Android电池监控的...
通过调用`Context.getSystemService(BATTERY_SERVICE)`方法获取BatteryManager实例,然后通过对应的常量(如BATTERY_LEVEL、BATTERY_STATUS等)查询电池状态。 其次,为了实时监控电池状态,可以注册...
在系统服务层面,Android有一个名为`BatteryService`的服务,它负责定期查询Power HAL获取电池信息,并将其更新到系统广播中。`BatteryService`是系统关键服务,位于`frameworks\base\services\core\java\...
在深入探讨Android电池管理的核心机制之前,我们先简要回顾一下Android系统架构,这将有助于理解BatteryService在其中扮演的角色。Android系统分为四个主要层次:应用程序层、应用程序框架层、库和Android运行时以及...
《深入剖析Android BatteryDog源码》 Android BatteryDog是一款针对Android设备电量监控的应用,它能够帮助用户追踪手机电池的使用情况,分析应用耗电行为,从而优化设备的电池寿命。通过对BatteryDog的源码进行...
4. **Android系统服务**:分析系统服务如Activity Manager、Power Manager、Battery Service等,它们是如何管理设备状态和用户交互的。 5. **JNI(Java Native Interface)**:学习如何使用JNI在Java代码和C/C++...
Framework/base/services/java/com/android/server/battery目录下的BatteryService.java和BatteryStatsService.java分别是用来监听电池事件和统计电池参数的服务。此外,系统还会自动触发过温报警和低电报警时的关机...
Android 系统或 Android 应用执行 shell 脚本的方法 Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等...
在分析源码时,可以查看`frameworks/base/services/core/java/com/android/server/BatteryService.java`,这是Android系统中电池服务的主要实现。这里包含了处理电池状态更新、广播发送和对外暴露接口等功能。通过对...
BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE); ``` 接下来,我们可以使用BatteryManager提供的方法来获取电池的状态、级别、温度等信息。例如,`getBatteryLevel()`方法...
《Battery-Indicator-Pro:深入解析Android电池指示器的开源实现》 在当今移动设备的世界里,电池指示器是用户界面中的重要元素,它为用户提供实时电池状态信息,从而帮助他们管理设备的用电情况。Battery-...
在Android系统中,服务(Service)是一种用于在后台执行长时间操作的应用组件,它不提供用户界面,但可以与其他组件交互。在某些情况下,开发者可能希望确保服务能够保持运行,即使设备资源紧张,也不会轻易被系统杀...
BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE); ``` 有了BatteryManager实例后,你可以调用其方法来获取电池信息。例如,以下代码片段展示了如何获取电池当前的...
### 玩转Android之-权限设置 在深入探讨Android中的权限设置之前,我们先来了解下Android系统是如何管理应用程序的权限的。Android系统通过权限(Permission)机制控制应用程序访问受保护的数据或执行可能对用户...