手機(jī)開(kāi)發(fā)者選項(xiàng)里面如何獲取CPU運(yùn)行信息的
做為Android開(kāi)發(fā)者來(lái)說(shuō)腌歉,應(yīng)該對(duì)開(kāi)發(fā)者選項(xiàng)是特別熟悉的。
通過(guò)【設(shè)置】->【開(kāi)發(fā)者選項(xiàng)】->【顯示cpu使用情況】這些步驟,可以看到CPU當(dāng)前的情況顷霹。
這個(gè)功能的實(shí)現(xiàn)在系統(tǒng)的源碼LoadAverageService類里實(shí)現(xiàn)的:com.android.systemui.LoadAverageService。
LoadAverageService是一個(gè)Service击吱。
以5.1.1_r1為例淋淀,我們看到的CPU的實(shí)時(shí)的情況是在com.android.systemui.LoadAverageService里實(shí)現(xiàn)的:
LoadAverageService
有一個(gè)內(nèi)部類LoadView
,用于展示CUP的實(shí)時(shí)情況覆醇,
數(shù)據(jù)從內(nèi)部類CpuTracker
獲取朵纷,這類繼承自ProcessCpuTracker。所以我們的重點(diǎn)是看看ProcessCpuTracker
是如何獲取CPU數(shù)據(jù)的永脓。
LoadAverageService的代碼只保留了主要結(jié)構(gòu)和核心的代碼:
package com.android.systemui;
import com.android.internal.os.ProcessCpuTracker;
public class LoadAverageService extends Service {
private View mView;
private static final class CpuTracker extends ProcessCpuTracker {
String mLoadText;
int mLoadWidth;
private final Paint mPaint;
CpuTracker(Paint paint) {
super(false);
mPaint = paint;
}
// 省略
}
private class LoadView extends View {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//重新獲取一次數(shù)據(jù)
mStats.update();
updateDisplay();
Message m = obtainMessage(1);
//每?jī)擅腌姼乱淮螖?shù)據(jù)
sendMessageDelayed(m, 2000);
}
}
};
LoadView(Context c) {
super(c);
//省略了初始化繪制時(shí)需要的工具
//這里創(chuàng)建了CpuTracker對(duì)象袍辞,并進(jìn)行了初始化
mStats = new CpuTracker(mLoadPaint);
mStats.init();
//更新展示,讓CPU的情況繪制到屏幕上
updateDisplay();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
//當(dāng)View和Window關(guān)聯(lián)后常摧,第一次發(fā)送繪制的異步消息
mHandler.sendEmptyMessage(1);
}
//省略...
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//省略
//獲取CPU的相關(guān)信息搅吁,并做一定的運(yùn)算
final CpuTracker stats = mStats;
final int userTime = stats.getLastUserTime();
final int systemTime = stats.getLastSystemTime();
final int iowaitTime = stats.getLastIoWaitTime();
final int irqTime = stats.getLastIrqTime();
final int softIrqTime = stats.getLastSoftIrqTime();
final int idleTime = stats.getLastIdleTime();
final int totalTime = userTime+systemTime+iowaitTime+irqTime+softIrqTime+idleTime;
if (totalTime == 0) {
return;
}
int userW = (userTime*W)/totalTime;
int systemW = (systemTime*W)/totalTime;
int irqW = ((iowaitTime+irqTime+softIrqTime)*W)/totalTime;
//繪制工作省略...
}
void updateDisplay() {
//View的高度寬度重新計(jì)算,主要用于判斷是否重新繪制View還是重新進(jìn)行測(cè)量落午。
if (neededWidth != mNeededWidth || neededHeight != mNeededHeight) {
mNeededWidth = neededWidth;
mNeededHeight = neededHeight;
requestLayout();
} else {
invalidate();
}
}
}
@Override
public void onCreate() {
super.onCreate();
//省略:把View add到屏幕上
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
//省略
}