`
xinanadu
  • 浏览: 228302 次
  • 性别: 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学习文档

    分析了framework中battery相关知识。

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

    本文实例讲述了Android编程之电池电量信息更新的方法。分享给大家供大家参考,具体如下: 电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。BatteryService是跑在system_process当中,在系统...

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

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

    BatteryService

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

    android权限大全

    android.permission.BATTERY_STATS: 该权限用于访问系统工具,例如电池统计信息。这个权限通常用于需要访问系统工具的应用程序,例如电池管理器等。 android.permission.BLUETOOTH: 该权限用于访问蓝牙设备,例如...

    Asynchronous Android Programming

    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...

    《深入理解Android》卷Ⅱ

    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 Action 事件是 Android 系统中的一种核心机制,用于在应用程序之间传递信息和事件通知。 Intent 是一种轻量级的消息对象,用于描述一个操作的请求或...

    CommonsWare.The.Busy.Coders.Guide.to.Android.Development.Version.8.2.2017

    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 ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...

    如何设计android锁屏程序.pptx

    如何实现锁屏程序 刘飞 如何设计android锁屏程序全文共27页,当前为第1... 设计自己的Service 屏幕关闭时锁屏程序启动 Android的framework会广播一些常用的消息 Answer,screen on,screen off,battery changed等 应用

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...

    Professional Android 4 Application Development 源代码

    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 ...

    Google Android SDK开发范例大全的目录

    6.2 手机电池计量还剩多少——使用BroadcastReceiver捕捉Intent.ACTION_BATTERY_CHANGED 6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送...

    The Busy Coders Guide to Android Development最终版2019

    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 ...

    Asynchronous Android Programming(PACKT,2ed,2016)

    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...

Global site tag (gtag.js) - Google Analytics