`
globaldev
  • 浏览: 34639 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android电源部分1

阅读更多
电池的信息,电压,温度,充电状态等等,都是由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如下:

       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)
分享到:
评论

相关推荐

    android的电源管理(PPT)

    本文档是一份对android之kernel3.0的电源管理部分的简单介绍与流程分析,是通过能源码的分析总结而成,内容涉及到kernel电源管理,与android系统的交互,各驱动模块的注册以及休眠与唤醒,同时也介绍了wakelock的...

    Android技术内幕.系统卷(清晰版扫描版)

    第4章分析了Android电源管理模块的机制与实现;第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;...

    Android技术内幕.系统卷 - 书签版

    第4章分析了Android电源管理模块的机制与实现;第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;...

    Android程序设计基础

    第一部分 Android简介 1 第1章 快速入门 3 1.1 安装工具 3 1.1.1 Java 5.0+ 3 1.1.2 Eclipse 4 1.1.3 Android 4 1.1.4 Eclipse插件 5 1.2 创建第一个程序 7 1.3 在模拟器上运行程序 8 1.4 在手机上运行程序...

    安卓锁屏九宫格锁屏解锁壁纸相关-拯救电源键最详尽的android开发一键锁屏实例源码.rar

    拯救电源键】最详尽的android开发一键锁屏实例 源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

    内容包括Android平台概览、Android应用程序设计精髓、Android用户界面设计精髓、Android应用程序设计精髓、对外发布你的Android应用程序和附录6个部分。附录还包含了Android开发常用工具(模拟器、DDMS和Eclipse)的...

    安卓(Android)系统的秘密

    1.使用Android电源管理widget 从Android 2.1系统开始内置了一个非常强大的带能源管理widget,通过这个widget你可以快速开启或者关闭Wi-Fi,蓝牙,GPS,同步这些手机耗电大户,还可以方便的设定手机屏幕亮度,长按手机...

    Android技术内幕.系统卷

    第4章分析了Android电源管理模块的机制与实现;第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;...

    Android技术内幕:系统卷.pdf 详细书签

    第4章分析了Android电源管理模块的机制与实现;第5章全面地剖析了Android硬件设备驱动(显示、视频、音频、MTD、Event、蓝牙、WLAN等)的工作原理和实现,掌握这部分内容即可修改和编写基于Android的设备驱动程序;...

    android 添加按(power键)电源键结束通话(挂断电话)

    首先我们发现现在我们所用的android智能手机大部分都有当你在打电话时按power键来挂断电话,一般都是在设置中。 我主要是在原生源码中添加这一功能,主要用于学习。。。。先看一张图: 看到那个按电源键挂断电话吧,...

    Android开发教程之电源管理详解

    本文实例讲述了Android电源管理。分享给大家供大家参考,具体如下: 一、 相关概念 1. 出于节电的需要,一般应用在用户一段时间无操作的情况下屏幕变暗,然后进入休眠状态 2. 用户只能在”设置->声音和显示”中设置...

    android电源管理

    Android的电源管理也是很重要的一部分。比如在待机的时候关掉不用的设备,timeout之后的屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等,这些都直接关系到产品的待机时间,以及用户体验。

    2010年谢彦的android笔记

    1 系统配置 1 1.1 建立SDK开发环境 2 1.2 Android源码的编译 6 1.3 编译在G1上运行的android 2.1(eclair)代码 9 1.4 编译在G1上运行的android 2.2(froyo)代码_旧方法 12 1.5 编译在G1上运行的android 2.2(froyo)代码...

    Android传感器MotionSensor开发实验.pdf

    c) Java运⾏环境(ANDROIDRUNTIME) Android运⾏库包括两部分:⼀是核⼼库,⼆是⾃⾝的Dalvik虚拟机。 核⼼库提供Java编程语⾔核⼼库的⼤多数功能。 Dalvik虚拟机是Google专为Android开发的 。每⼀个Android应⽤程序都...

    FT311D Android APK

    基于Android开发平台的软件开发,FT311D硬件接口应用程序主要包括两部分,即用户层User Layer和接口层Layer,用户层面向高层应用程序开发,程序员不需要过多考虑Android设备与FT311D接口芯片通信的具体细节,只需要...

    晶晨AML8726-M Android 平板培训资料

    Chapter Eight:指南一 按键、电源部分介绍 Chapter Nine:指南二 添加自己的项目相关内容 Chapter Ten 指南三 Chapter Eleven:指南四 扩展外设的应用及实践 Chapter Twelve:指南五 应用开发和实践 p ...

    Android powermanger wakelock

    Android 电源管理 -- wakelock机制,通过控制wakelock 实现保持pad 禁止休眠状态; Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序和内核获得. 这个锁可以是有超时的 或者 是...

    MTK_MT6575开发驱动部分介绍2510474709.pdf

    本篇文章适合初学MTK智能机部分的底层驱动学习,虽然是一些简单的介绍,但是对初学者非常好。我就是从这个开始学习的,欢迎一同交流 主要内容: 1、与主芯片搭配的芯片及性能 2、android编译环境以及相关指令(包括...

Global site tag (gtag.js) - Google Analytics