Android 4.0 から標準の設定アプリに「CPU使用状況を表示」機能が追加されました。
この機能を有効にすると、画面右上に「現在のCPU使用状況」がオーバーレイ表示されます。
はっきり言って使われない機能だと思うのですが、以下の 2点 が気になったので調べてみました。
1. オーバーレイ表示される ○ / △ / □ の3つの数値の意味
2. オーバー例の方法
※最前面のオーバーレイ表示のレイヤーは、タッチしてもイベントを受け取らないようになっている
1. オーバーレイ表示される ○ / △ / □ の数値の意味
Linux における /proc/loadavg で表示される最初の3つの情報であり、
1つ目が「過去1分間」、2つ目が「過去5分間」、3つ目が「過去15分間」のCPU使用率となります。
※「adb shell cat /proc/loadave」でも表示可
2. オーバーレイの方法
com.android.systemui.LoadAverageService クラスに実装コードがありましたが、
通常のアプリでは、WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY を使用する権限がないため、
以下の実装を真似しても動作しませんでした。。。
package com.android.systemui;
// ・・・省略・・・
public class LoadAverageService extends Service {
private View mView;
// ・・・省略・・・
private class LoadView extends View {
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// ここでオーバーレイしたい情報を描画
}
}
// ・・・省略・・・
@Override
public void onCreate() {
super.onCreate();
mView = new LoadView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY, // <-
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
params.setTitle("Load Average");
WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
wm.addView(mView, params);
}
@Override
public void onDestroy() {
super.onDestroy();
((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(mView);
mView = null;
}
// ・・・省略・・・
}
ちなみに、TYPE_SECURE_SYSTEM_OVERLAY のコメントは、以下のとおりです。
※hide を無視して定数あわせても駄目です
/**
* Window type: secure system overlay windows, which need to be displayed
* on top of everything else. These windows must not take input
* focus, or they will interfere with the keyguard.
*
* This is exactly like {@link #TYPE_SYSTEM_OVERLAY} except that only the
* system itself is allowed to create these overlays. Applications cannot
* obtain permission to create secure system overlays.
* @hide
*/
public static final int TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15;
公開 API として一般のアプリ権限で使用できれば、使い道もあると思うのですが^^;

