- 浏览: 228302 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 5544在BroadcastReceiver中接收到广播之后,有时 ... -
工作线程(后台线程)内操作UI线程(主线程)的方法汇集
2013-11-11 18:20 1389Activity.runOnUiThread(Runna ... -
android获取手机联系人,非SIM卡联系人,联系人账户概念
2013-10-30 17:52 7320最近在做一个项目,需要只显示手机联系人,不显示SIM卡联系 ... -
Android Checkbox自定义背景bug
2013-10-28 17:09 47881,Checkbox 设置完button属性后,文本和but ... -
启动其他应用的activity
2013-08-30 15:23 1629启动其他应用的activity,只需要两个东西。该应用的包 ... -
SIM卡ICCID标识与IMSI的区别
2013-05-28 10:21 13778ICCID:Integrate circui ... -
The method show(FragmentManager, String) in the type DialogFragment is not appli
2013-04-17 16:06 5330The method show(FragmentManag ... -
跨应用(跨进程)发送广播和接收广播
2013-03-16 10:36 20769跨应用发送和接收广播,与同应用下的情况差不多,只需要添加一 ... -
android 检查GPS是否开启,打开GPS设置界面
2012-10-07 12:44 7377转自http://iriverman.iteye.com/bl ... -
android自带图标
2012-09-25 15:08 908安卓自带的图标,可以直接拿来用的,分享下 http:/ ... -
安卓 拨号界面和直接拨打界面
2012-09-18 10:59 6723/** *打电话 * * @para ... -
android 移除remove元素
2012-08-30 09:34 1891移除某个元素,用 ((ViewManager) (vi ... -
View not attached to window manager
2012-08-29 15:32 2747转载 今天在写程序中遇到如下问题,如此怪异,在网上找了很 ... -
.如何计算两点之间距离
2012-08-28 15:41 3849——摘自百度地图http://dev.baidu.com/ ... -
[androidpn通信] 『bug』客户端断网或者关机,服务器端session没关闭
2012-08-14 16:42 4932客户端断网或者关机,服务器端session没关闭的解决方案: ... -
Android开发:判断sdCard是否已安装的两种方法
2012-06-21 13:37 1091第一种方法是常用的通过判断ExternalStorageS ... -
Android标题栏各种设置
2012-06-20 14:25 15551、隐藏标题栏requestWindowFeature(Win ... -
利用Sensor实现android手机类似于微信摇一摇
2012-06-11 15:36 1652传感器有几种类型:方向传感器: Sensor.TYPE_O ... -
从android系统图库中取图片的代码
2012-06-11 14:26 1296该文章转载自 http://marshal.easymor ... -
surfaceView 清空canvas的一种方式
2012-06-04 23:41 6046canvas.drawColor(Color.TRANS ...
相关推荐
分析了framework中battery相关知识。
本文实例讲述了Android编程之电池电量信息更新的方法。分享给大家供大家参考,具体如下: 电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。BatteryService是跑在system_process当中,在系统...
实现一个电池属性实时监听器。这些属性包括温度,电池电量.......而且,使用Service,Broadcast,以及Thread的方式来实现。MyBatteryService后台获取Battery属性值,然后,在Activity中进行相关数据的显示。
BatteryService 是android中提供电源管理的类(Android 4.1.2)
android.permission.BATTERY_STATS: 该权限用于访问系统工具,例如电池统计信息。这个权限通常用于需要访问系统工具的应用程序,例如电池管理器等。 android.permission.BLUETOOTH: 该权限用于访问蓝牙设备,例如...
Defer, schedule, and batch work on the Android system without compromising the battery life and user experience Use the JNI interface to execute concurrent work on native layer Pull and push data from...
6.5 startService之按图索骥 6.5.1 Service知识介绍 6.5.2 startService流程图 6.6 AMS中的进程管理 6.6.1 Linux进程管理介绍 6.6.2 关于Android中的进程管理的介绍 6.6.3 AMS进程管理函数分析 6.6.4 AMS...
Android 广播大全 Intent Action 事件 Android 广播大全 Intent Action 事件是 Android 系统中的一种核心机制,用于在应用程序之间传递信息和事件通知。 Intent 是一种轻量级的消息对象,用于描述一个操作的请求或...
AlarmManager and the Scheduled Service Pattern PowerManager and WakeLocks JobScheduler Accessing Location-Based Services The Fused Location Provider Working with the Clipboard Telephony Working With ...
6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...
6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...
如何实现锁屏程序 刘飞 如何设计android锁屏程序全文共27页,当前为第1... 设计自己的Service 屏幕关闭时锁屏程序启动 Android的framework会广播一些常用的消息 Answer,screen on,screen off,battery changed等 应用
6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...
Using the Intent Service to Simplify the Earthquake Update Service Chapter 10: Expanding the User Experience Introducing the Action Bar Adding an Action Bar to the Earthquake Monitor Creating and ...
6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...
AlarmManager and the Scheduled Service Pattern PowerManager and WakeLocks JobScheduler Accessing Location-Based Services The Fused Location Provider Working with the Clipboard Telephony Working With ...
Defer, schedule, and batch work on the Android system without compromising the battery life and user experience Use the JNI interface to execute concurrent work on native layer Pull and push data from...