激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android編程之電池電量信息更新的方法(基于BatteryService實現(xiàn))

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

2021-04-09 14:36balenofly Android

這篇文章主要介紹了Android編程之電池電量信息更新的方法,主要基于BatteryService實現(xiàn)該功能,以實例形式分析了Android獲取電池電量的具體步驟與實現(xiàn)技巧,需要的朋友可以參考下

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

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

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

?
1
2
3
Log.i(TAG, "Starting Battery Service.");
BatteryService battery = new BatteryService(context);
ServiceManager.addService("battery", battery);

1. 數(shù)據來源

BatteryService通過JNI(com_android_server_BatteryService.cpp)讀取數(shù)據。BatteryService通過JNI注冊的不僅有函數(shù),還有變量。 如下:

?
1
2
3
4
5
6
7
8
9
10
//##############在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中聲明的變量

?
1
2
3
4
5
6
7
8
9
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");

上面這些變量的值,對應是從下面的文件中讀取的,一只文件存儲一個數(shù)值。

?
1
2
3
4
5
6
7
8
9
#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. 數(shù)據傳送

電池的這些信息是通過何種方式,被其他應用所獲得的。可以想到的有兩種方式,第一種,應用主動從BatteryService獲得數(shù)據;第二種,BatteryService主動把數(shù)據傳送給所關心的應用程序。

BatteryService采用的是第二種方式,所有的電池的信息數(shù)據是通過Intent傳送出去的。在BatteryService.java中,Code如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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. 數(shù)據接收

應用如果想要接收到BatteryService發(fā)送出來的電池信息,則需要注冊一個Intent為Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。

注冊方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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. 數(shù)據更新

電池的信息會隨著時間不停變化,自然地,就需要考慮如何實時的更新電池的數(shù)據信息。在BatteryService啟動的時候,會同時通過UEventObserver啟動一個onUEvent Thread。

每一個Process最多只能有一個onUEvent Thread,即使這個Process中有多個UEventObserver的實例。當在一個Process中,第一次Call startObserving()方法后,這個UEvent thread就啟動了。

而一旦這個UEvent thread啟動之后,就不會停止。

?
1
2
3
4
5
6
7
8
//在BatteryService.java中
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
private UEventObserver mUEventObserver = new UEventObserver() {
  @Override
  public void onUEvent(UEventObserver.UEvent event) {
   update();
  }
};

在UEvent thread中會不停調用 update()方法,來更新電池的信息數(shù)據。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久精品视频在线免费观看 | 538任你躁在线精品视频网站 | 久久久久久久久日本理论电影 | 欧美a黄| 国产午夜精品久久久久久免费视 | 国产小视频在线 | 久久久成人一区二区免费影院 | 自拍偷拍亚洲图片 | 久久亚洲线观看视频 | 久久美女免费视频 | 中文字幕伦乱 | 91免费在线看片 | 国产一区二区三区四区五区精品 | 亚洲视频网 | 免费国产一区二区视频 | 老a影视网站在线观看免费 欧美日韩成人一区二区 | 真人一级毛片免费 | 中文字幕网站在线 | 精品一区二区电影 | 欧美成人一区二区三区电影 | 中文字幕www.| 亚洲一区二区三区精品在线观看 | 美女色影院 | 凹凸成人精品亚洲精品密奴 | 国产精品中文在线 | 玩偶姐姐在线观看免费 | 欧美精品一区二区蜜臀亚洲 | 中国产一级毛片 | 欧美成人一级 | 美女久久久久 | 欧美精品18| 自拍偷拍999| 成人免费一区二区 | 成人片免费视频 | 日韩视频在线一区二区三区 | 特黄一区二区三区 | 午夜视频免费在线观看 | 欧美激情性色生活片在线观看 | 精品国产一区二区在线 | 一区二区三区日韩视频在线观看 | 日本久久久网站 |