阅读514 返回首页    go 阿里云 go 技术社区[云栖]


Android的StatusBar分析

 

这里仅讨论状态栏右半部分,不包括Notification部分。开机初始化相关略。以电池电量显示为例,大概关键步骤如下:

1 通过BroadcastReceiver机制,StatusBarPolicy中注册的mIntentReceiver收到BatteryService广播的ACTION_BATTERY_CHANGED事件触发;

2 调用updateBattery(intent)开始更新电池状态栏;

3 从intent中解析需要的字段,调用StatusBarManager的setIcon()。StatusBarManager是客户端使用的状态栏管理类;

4 通过IBinder机制跨进程调用StatusBarManagerService的setIcon()。StatusBarManagerService派生于IStatusBarService.Stub,是状态栏管理的服务端,是具体实现;

5 StatusBarManagerService有一个StatusBarIconList成员,这个list成员在StatusBarManagerService创建时,从R.array.config_statusBarIcons加载生成。StatusBarManagerService的setIcon()过程中,会又"battery"字段获得在StatusBarIconList中的索引,再由包名、图片id和等级创建StatusBarIcon实例,并将这个实例更新StatusBarIconList中所获得索引对应项;

6 调用CommandQueue的setIcon()。CommandQueue派生于IStatusBar.Stub,有一个内部接口Callbacks,这个接口的实现就是StatusBarService。CommandQueue、StatusBarService和StatusBarManager属于同一个进程,而StatusBarManagerService是一个系统级服务,它们之间必然需要通过IBinder进程间通信;

7 CommandQueue用于处理状态栏、通知相关的请求,内部维护了一个事件队列,setIcon()会创建一个OP_SET_ICON的massege,发送给Handler处理;

8 CommandQueue内部也有一个StatusBarIconList实例,这个实例是由StatusBarService创建。在处理OP_SET_ICON的massege前,会先通过getViewIndex获得图标View的位置索引viewIndex,(因为有些图标有可能为空)再更新StatusBarIconList,最后调用Callbacks,也就是StatusBarService的addIcon()或者updateIcon();

9 以addIcon()为例,StatusBarService的addIcon()会创建一个新的StatusBarIconView,将第5步中所创建的StatusBarIcon实例设置进去,然后把这个view添加到LinearLayout的viewIndex位置。

这样一个电池相关图标就在状态栏上添加或者更新了。删除操作类似。

另:

IStatusBarService.aidl和IStatusBar.aidl在platform\frameworks\base\core\java\com\android\internal\statusbar中

    <string-array name="config_statusBarIcons">
       <item><xliff:g >ime</xliff:g></item>
       <item><xliff:g >sync_failing</xliff:g></item>
       <item><xliff:g >sync_active</xliff:g></item>
       <item><xliff:g >gps</xliff:g></item>
       <item><xliff:g >bluetooth</xliff:g></item>
       <item><xliff:g >nfc</xliff:g></item>
       <item><xliff:g >tty</xliff:g></item>
       <item><xliff:g >speakerphone</xliff:g></item>
       <item><xliff:g >mute</xliff:g></item>
       <item><xliff:g >volume</xliff:g></item>
       <item><xliff:g >wifi</xliff:g></item>
       <item><xliff:g >cdma_eri</xliff:g></item>
       <item><xliff:g >data_connection</xliff:g></item>
       <item><xliff:g >phone_evdo_signal</xliff:g></item>
       <item><xliff:g >phone_signal</xliff:g></item>
       <item><xliff:g >battery</xliff:g></item>
       <item><xliff:g >alarm_clock</xliff:g></item>
       <item><xliff:g >secure</xliff:g></item>
       <item><xliff:g >clock</xliff:g></item>
    </string-array>

 

详细序列图如下:

最后更新:2017-04-02 06:52:02

  上一篇:go isalpha &lt;ctype.h&gt; &lt;cctype&gt;
  下一篇:go HierarchicalStateMachine.java