亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android編程之電池電量信息更新的方法(基于BatteryService實現)

2020-04-11 11:18:53
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程之電池電量信息更新的方法。分享給大家供大家參考,具體如下:

電池的信息,電壓,溫度,充電狀態等等,都是由BatteryService來提供的。BatteryService是跑在system_process當中,在系統初始化的時候啟動,如下

在SystemServer.java中可以看到啟動BatteryService的代碼:

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. 數據傳送

電池的這些信息是通過何種方式,被其他應用所獲得的??梢韵氲降挠袃煞N方式,第一種,應用主動從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()方法,來更新電池的信息數據。

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性极品xxxx娇小| 亚洲裸体xxxx| 欧美一级淫片丝袜脚交| 俺去啦;欧美日韩| 国产精品第10页| 亚洲精品久久视频| 夜夜嗨av色综合久久久综合网| 狠狠爱在线视频一区| 亚州国产精品久久久| 久久亚洲精品网站| 国产精品视频大全| 国产精品电影久久久久电影网| 91中文字幕在线| 久久久噜噜噜久久中文字免| 97免费在线视频| 日韩欧美一区视频| 亚洲欧美日韩图片| 久久综合国产精品台湾中文娱乐网| 欧美黑人性视频| 欧美丰满片xxx777| 国产精品户外野外| 亚洲一区制服诱惑| 成人黄色大片在线免费观看| 国自产精品手机在线观看视频| 青草青草久热精品视频在线观看| 在线精品91av| 亚洲欧美国产日韩中文字幕| 亚洲国产女人aaa毛片在线| 成人免费在线网址| 欧美日韩亚洲一区二| 国产精品国语对白| 国产91精品高潮白浆喷水| 国产精品久久久久91| 中文字幕亚洲一区在线观看| 亚洲在线免费视频| 精品久久久久久亚洲国产300| 777午夜精品福利在线观看| 欧美视频裸体精品| 亚洲娇小xxxx欧美娇小| 亚洲视频在线观看视频| 色视频www在线播放国产成人| 亚洲老头同性xxxxx| 久久久久久久久91| 91精品国产乱码久久久久久蜜臀| 午夜精品国产精品大乳美女| 97国产精品视频| 欧美在线视频在线播放完整版免费观看| 国产精品久久久久久五月尺| 国产精品国产福利国产秒拍| 亚洲一区二区三区sesese| 欧美日韩亚洲激情| 国模精品视频一区二区三区| 久久久久久久999| 亚洲欧美日韩一区二区三区在线| 精品久久久久久久中文字幕| 久久精品国产一区二区三区| 久久久国产精品一区| 亚洲一区第一页| 国产自产女人91一区在线观看| 精品综合久久久久久97| 国产精品亚洲网站| 亚洲人永久免费| 国产精品欧美日韩一区二区| 亚洲精品中文字幕av| 日韩欧美国产黄色| 久久精视频免费在线久久完整在线看| 欧美激情第三页| 欧美激情久久久久| 国产在线观看一区二区三区| 成人在线视频网站| 亚洲精品天天看| 亚洲国产高清高潮精品美女| 影音先锋日韩有码| 国产美女精品视频| 亚洲人成欧美中文字幕| 国产精品久久久久久久久久尿| 亚洲3p在线观看| 欧美三级欧美成人高清www| 高清亚洲成在人网站天堂| 91av中文字幕| 久久九九全国免费精品观看| 国产在线视频不卡| 欧美一区二区影院| 亚洲va欧美va国产综合久久| 亚洲色图18p| 日韩精品亚洲精品| 国产日韩欧美一二三区| 日产日韩在线亚洲欧美| 日韩精品有码在线观看| 国产精品欧美日韩一区二区| 国内精品久久久久影院 日本资源| 国产精品久久久久久久久免费| 欧美激情一区二区三区久久久| 国产精品自产拍高潮在线观看| 91国偷自产一区二区三区的观看方式| 91在线网站视频| 亚洲一区二区免费在线| 国产91久久婷婷一区二区| 97超级碰碰碰久久久| 日韩av日韩在线观看| 最近2019免费中文字幕视频三| 国产精品狼人色视频一区| 国产成人avxxxxx在线看| 欧美中文在线视频| 亚洲综合第一页| 亚洲最新在线视频| 日韩电影在线观看免费| 色偷偷噜噜噜亚洲男人| 精品国产福利在线| 在线免费观看羞羞视频一区二区| 亚洲韩国欧洲国产日产av| 国产精品手机播放| 欧美激情网站在线观看| 一个人看的www欧美| 国内精品一区二区三区四区| 亚洲最大的网站| 最近2019好看的中文字幕免费| 中文字幕最新精品| 精品人伦一区二区三区蜜桃网站| 在线观看欧美成人| 91在线视频精品| 国产69久久精品成人| 一区二区三区动漫| 亚洲精品ady| 日韩在线不卡视频| 久久夜色精品亚洲噜噜国产mv| 久久精品亚洲国产| 精品视频一区在线视频| 成人福利视频在线观看| 欧美一级高清免费| 国产精品午夜视频| 亚洲一区二区久久| 国产精品扒开腿爽爽爽视频| 91精品国产免费久久久久久| 69影院欧美专区视频| 91国产美女在线观看| 欧美精品日韩www.p站| www.亚洲免费视频| 欧美人在线观看| 欧美亚洲第一页| 欧美在线视频网| 69av成年福利视频| 久久久国产一区二区| 欧美激情亚洲自拍| 欧美最猛性xxxxx(亚洲精品)| 国产精品久久久久久久久久三级| 97在线免费观看视频| 一区二区三区视频观看| 国产一区玩具在线观看| 欧美精品免费在线观看| 热re91久久精品国99热蜜臀| 日韩在线中文视频| 国产成人综合一区二区三区| 国产精品亚洲视频在线观看| 不卡在线观看电视剧完整版| 久久在线免费观看视频| 欧美在线视频观看免费网站| 国产一区二区三区免费视频| 日本国产一区二区三区| 国产精品视频白浆免费视频| 欧美视频中文在线看| 曰本色欧美视频在线| 国产精品久久久久久久久久三级| 国产精品免费小视频|