`
xinanadu
  • 浏览: 231597 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android之 BatteryService

 
阅读更多

 

在做一个显示电池电量的窗口小部件,看到这篇文章,很不错。转一下。原文链接: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)


分享到:
评论

相关推荐

    Android编程之电池电量信息更新的方法(基于BatteryService实现)

    在Android系统中,获取电池电量信息是通过BatteryService这一核心服务来实现的。BatteryService是一个系统级别的服务,它运行在system_process进程中,并在系统启动时由SystemServer初始化并启动。在`SystemServer....

    Android-电池管理-实时获取电池电量,温度...等属性。

    实现一个电池属性实时监听器。这些属性包括温度,电池电量.......而且,使用Service,Broadcast,以及Thread的方式来实现。MyBatteryService后台获取Battery属性值,然后,在Activity中进行相关数据的显示。

    BatteryService

    BatteryService 是android中提供电源管理的类(Android 4.1.2)

    Android应用源码battery(电池)监控程序.zip

    "Android应用源码battery(电池)监控程序.zip"提供了一种实现电池状态监控的方法,这可以帮助开发者了解应用对电池寿命的影响,优化应用性能,或者创建专门的电池管理工具。下面,我们将深入探讨Android电池监控的...

    基于Android的battery(电池)监控程序.zip

    通过调用`Context.getSystemService(BATTERY_SERVICE)`方法获取BatteryManager实例,然后通过对应的常量(如BATTERY_LEVEL、BATTERY_STATUS等)查询电池状态。 其次,为了实时监控电池状态,可以注册...

    android手机电量显示源代码

    在系统服务层面,Android有一个名为`BatteryService`的服务,它负责定期查询Power HAL获取电池信息,并将其更新到系统广播中。`BatteryService`是系统关键服务,位于`frameworks\base\services\core\java\...

    android 电池管理

    在深入探讨Android电池管理的核心机制之前,我们先简要回顾一下Android系统架构,这将有助于理解BatteryService在其中扮演的角色。Android系统分为四个主要层次:应用程序层、应用程序框架层、库和Android运行时以及...

    android BatteryDog源码.rar

    《深入剖析Android BatteryDog源码》 Android BatteryDog是一款针对Android设备电量监控的应用,它能够帮助用户追踪手机电池的使用情况,分析应用耗电行为,从而优化设备的电池寿命。通过对BatteryDog的源码进行...

    Android底层开发实战_Android底层开发实战_android_android开发实战_

    4. **Android系统服务**:分析系统服务如Activity Manager、Power Manager、Battery Service等,它们是如何管理设备状态和用户交互的。 5. **JNI(Java Native Interface)**:学习如何使用JNI在Java代码和C/C++...

    Android实现电池管理系统

    Framework/base/services/java/com/android/server/battery目录下的BatteryService.java和BatteryStatsService.java分别是用来监听电池事件和统计电池参数的服务。此外,系统还会自动触发过温报警和低电报警时的关机...

    如何让Android系统或Android应用执行shell脚本

    Android 系统或 Android 应用执行 shell 脚本的方法 Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等...

    Android 之 监控手机电量

    在分析源码时,可以查看`frameworks/base/services/core/java/com/android/server/BatteryService.java`,这是Android系统中电池服务的主要实现。这里包含了处理电池状态更新、广播发送和对外暴露接口等功能。通过对...

    Android自定义显示电池电量

    BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE); ``` 接下来,我们可以使用BatteryManager提供的方法来获取电池的状态、级别、温度等信息。例如,`getBatteryLevel()`方法...

    Battery-Indicator-Pro,Android电池指示灯.zip

    《Battery-Indicator-Pro:深入解析Android电池指示器的开源实现》 在当今移动设备的世界里,电池指示器是用户界面中的重要元素,它为用户提供实时电池状态信息,从而帮助他们管理设备的用电情况。Battery-...

    Android-提高android服务进程的优先级

    在Android系统中,服务(Service)是一种用于在后台执行长时间操作的应用组件,它不提供用户界面,但可以与其他组件交互。在某些情况下,开发者可能希望确保服务能够保持运行,即使设备资源紧张,也不会轻易被系统杀...

    Android-电池信息获取

    BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE); ``` 有了BatteryManager实例后,你可以调用其方法来获取电池信息。例如,以下代码片段展示了如何获取电池当前的...

    玩转Android之-权限设置

    ### 玩转Android之-权限设置 在深入探讨Android中的权限设置之前,我们先来了解下Android系统是如何管理应用程序的权限的。Android系统通过权限(Permission)机制控制应用程序访问受保护的数据或执行可能对用户...

Global site tag (gtag.js) - Google Analytics