首页 > Android, Other > Android中的状态监控—-Status Bar

Android中的状态监控—-Status Bar

2009-10-30 08:06 星期五    浏览: 3,252    绿 发表评论 阅读评论

Android下的监控包括很多类型,如无线网络的信号强度,无线网络数据类型(GPRS/EDGE/3G/CDMA1.x/CDMA-EVDO),是否漫游、WiFi信号强度,数据传输方向(下载还是上传),电池电量、蓝牙等。这些信息提示由各种图标组成,系统判断不同的状态后就将不同的图标显示在屏幕顶端的状态栏中。这些图标放在源码包中的frameworks/base/core/res/res/drawable/目录下,多以stat_sys_为开头前缀。

代码文件:

frameworks/base/services/java/com/android/server/status/

StatusBarIcon.java

StatusBarView.java

StatusBarService.java

StatusBarPolicy.java

 

frameworks/base/core/java/android/app

StatusBarManager.java

IStatusBar.aidl

 

StatusBarIconStatusBarView它们的功能纯粹是显示GUI

StatusBarService提供了各种服务,如添加删除提示图标,下拉状态栏等。为clients提供功能服务。

StatusBarPolicy接受来自系统的信息,更新状态栏中的状态。

StatusBarManagerIStatusBar,可以让别的App很方便地使用StatusBarService,是对其功能使用的一个wrapper

 

StatusBarService 继承自 IStatusBar.Stub,实现了该接口中的服务,该服务提供的接口的功能是:当系统有提示信息,如USB设备插拔时添加删除提示图标,展开状态提示面板等功能。

 

interface IStatusBar

{

void activate();

void deactivate();

void toggle();

void disable(int what, IBinder token, String pkg);

IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel);

void updateIcon(IBinder key, String slot, String iconPackage, int iconId, int iconLevel);

void removeIcon(IBinder key);

}

 

在实现上面的接口操作时,只是简单地创建一个operation对象,即类PendingOp的实例,并将其添加到队列中。上面不同的接口对应着不同的operationHandler子类H(也是一个嵌套类)负责去处理这些operationHandler一般是在另一个线程中进行message的处理。于是,对上面的操作就可以放到不同的线程中去处理了。

Handler在对消息队列处理后,会调用StatusBarService进行真正的功能处理。

 

StatusBarManager允许app去控制Status Bar,它是对status bar service进行调用的一个wrapperApp开发者可以直接使用它的IStatusBar中的声明的同名接口

 

StatusBarPolicy类负责从系统获取信息,动态记录并实时更新状态,从它下面的这些成员函数可以大概看出它可以更新的信息包括哪些:

interface IStatusBar

updateClock()

updateAlarm
updateSyncState
updateBattery

updateSignalStrength

updateDataNetType

updateDataIcon

updateVolume

updateBluetooth

updateWifi

updateGps

updateTTY

showLowBatteryWarning

 

总结:

从上可以看出,clients程序使用StatusBarManager操控StatusBar,该操控由StatusBarService提供服务去完成。StatusBarIconStatusBarView负责图标视图等去显示。StatusBarPolicy负责提供状态更新。

 

Example:网络数据类型的判断及显示

判断无线网络数据类型是2G还是3G,见StatusBarPolicy.updateDataNetType函数。它依赖TelephonyManager去实现该判断,见文件frameworks/base/telephony/java/android/telephony/TelephonyManager.java

中的TelephonyManager. getNetworkType()函数,行400

在该函数中获取属性PROPERTY_DATA_NETWORK_TYPE的值:

String prop = SystemProperties.get(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE);

frameworks/base/telephony/java/com/android/internal/telephony/ TelephonyProperties.java中:

static String PROPERTY_DATA_NETWORK_TYPE = “gsm.network.type”;

我们可以在命令行中用下面的命令获取它的值:

~ # getprop gsm.network.type

我们可以在命令行中用下面的命令手工修改它的值:

~ # setprop gsm.network.type UMTS

然后将prop与下面的字符串比较:

“GPRS”“EDGE”“UMTS”“CDMA”“CDMA – EvDo rev. 0″“CDMA – EvDo rev. A”“CDMA – 1xRTT”

是哪个值,就设置对应的图标。

再往下跟,当网络数据类型有变化时,在frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java中的Line873GsmServiceStateTracker .pollStateDone()函数中),对该属性进行设置:

if (hasNetworkTypeChanged) {

phone.setSystemProperty(PROPERTY_DATA_NETWORK_TYPE,

networkTypeToString(networkType));

}

网络类型的变化会由GsmServiceStateTracker .handlePollStateResult函数去判断。具体在states字符串的第4个字符串中(即states[3]),见代码:

// states[3] (if present) is the current radio technology

if (states.length >= 4 && states[3] != null) {

type = Integer.parseInt(states[3]);

而字符串数组的结果又来自于AsyncResult.result:

case EVENT_POLL_STATE_GPRS:

states = (String[])ar.result;

而实参AsyncResult ar是来自于GsmServiceStateTracker .handleMessage处理Message时的msg实参:

case EVENT_POLL_STATE_REGISTRATION:

case EVENT_POLL_STATE_GPRS:

case EVENT_POLL_STATE_OPERATOR:

case EVENT_POLL_STATE_NETWORK_SELECTION_MODE:

ar = (AsyncResult) msg.obj;

附注:GsmServiceStateTracker .handleMessage会处理其自己定义的各种类型的eventmessage,这些event 类型包括:

//*****GSM events
protected static final int EVENT_RADIO_STATE_CHANGED = 1;
protected static final int EVENT_NETWORK_STATE_CHANGED = 2;
protected static final int EVENT_GET_SIGNAL_STRENGTH = 3;
protected static final int EVENT_POLL_STATE_REGISTRATION = 4;
protected static final int EVENT_POLL_STATE_GPRS = 5;
protected static final int EVENT_POLL_STATE_OPERATOR = 6;
protected static final int EVENT_POLL_SIGNAL_STRENGTH = 10;
protected static final int EVENT_NITZ_TIME = 11;
protected static final int EVENT_SIGNAL_STRENGTH_UPDATE = 12;
protected static final int EVENT_RADIO_AVAILABLE = 13;
protected static final int EVENT_POLL_STATE_NETWORK_SELECTION_MODE = 14;
protected static final int EVENT_GET_LOC_DONE = 15;
protected static final int EVENT_SIM_RECORDS_LOADED = 16;
protected static final int EVENT_SIM_READY = 17;
protected static final int EVENT_LOCATION_UPDATES_ENABLED = 18;
protected static final int EVENT_GET_PREFERRED_NETWORK_TYPE = 19;
protected static final int EVENT_SET_PREFERRED_NETWORK_TYPE = 20;
protected static final int EVENT_RESET_PREFERRED_NETWORK_TYPE = 21;
protected static final int EVENT_CHECK_REPORT_GPRS = 22;
protected static final int EVENT_RESTRICTED_STATE_CHANGED = 23;

//*****CDMA events:
protected static final int EVENT_POLL_STATE_REGISTRATION_CDMA = 24;
protected static final int EVENT_POLL_STATE_OPERATOR_CDMA = 25;
protected static final int EVENT_RUIM_READY = 26;
protected static final int EVENT_RUIM_RECORDS_LOADED = 27;
protected static final int EVENT_POLL_SIGNAL_STRENGTH_CDMA = 28;
protected static final int EVENT_GET_SIGNAL_STRENGTH_CDMA = 29;
protected static final int EVENT_NETWORK_STATE_CHANGED_CDMA = 30;
protected static final int EVENT_GET_LOC_DONE_CDMA = 31;
protected static final int EVENT_SIGNAL_STRENGTH_UPDATE_CDMA = 32;
protected static final int EVENT_NV_LOADED = 33;
protected static final int EVENT_POLL_STATE_CDMA_SUBSCRIPTION = 34;
protected static final int EVENT_NV_READY = 35;
protected static final int EVENT_ERI_FILE_LOADED = 36;

 

GsmServiceStateTracker .handleMessage处理来自于ril daemon的进程的消息。

上面这些属于Android Framework,启动后在com.android.phone进程之中。

本文链接地址: http://blog.redwolf-soft.com/?p=852

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。