Android状态栏下拉处理

时间: 2023-07-11 admin IT培训

Android状态栏下拉处理

Android状态栏下拉处理

  对安卓系统来说, 系统栏下拉菜单, 可能是和用户交互最多的UI模块之一. 虽然它提供的功能在各个厂商的定制UI上大同小异, 但还是有一些用户有定制化需求, 所以有必要搞清楚它的大致框架及流程.

StatusBar和SystemUI的关系
StatusBar是SystemUI的一部分, 那么它和SystemUI是如何联系在一起的呢:
  BaseStatusBar继承了SystemUI
  PhoneStatusBar继承了BaseStatusBar;
  从源码中可以看到, TvStatusBar也继承了BaseStatusBar; 意味着如果我们要把Android移植到Phone和TV之外的新设备上, 并且需要一个不同的StatusBar的时候, 可以通过继承BaseStatusBar实现.

布局显示

主要布局文件有如下几个:
super_status_bar.xml
status_bar.xml
status_bar_expanded.xml
brightness_mirror.xml
最顶层是super_status_bar, 会走两个分支status_bar和status_bar_expanded; status_bar是系统栏, status_bar_expanded是系统栏下拉菜单

  1. status_bar这个分支主要呈现的是状态栏界面,状态栏细分左边和右边,左边是通知栏,右边是系统功能的状态图标显示
  2. status_bar_expanded这个分支主要呈现的下拉菜单界面,下拉菜单中又分快捷图标和信息通知栏
    keyguard_status_view: 这个是锁屏界面的View
    qs_panel: QS快捷面板
    notification_stack_scroller: 信息通知栏

元素尺寸
如下文件, 定义了QS下拉面板中各项元素的尺寸大小
frameworks/base/packages/SystemUI/res/values/dimens.xml

系统栏的主要功能

1. 系统栏图标

 主要是通过StatusBarIconController来控制状态栏图标的显示
 包括:
  BatteryMeterView: 电池图标.具体实现使用一个BatteryMeterDrawable来进行绘制.
 如果需要更换电池图标, 修改绘制方法或者替换图标即可.
  SignalClusterView ( R.id.signal_cluster ): 信号栏图标显示控制
  mSystemIconArea ( R.id.system_icon_area ): 系统图标显示区域

2. 快速设置面板

 QSContainer:是整个下拉菜单的实现者, 它包含了QSPanel和BaseStatusBarHeader
同时也管理了QS header和panel的动画
 快速设置面板, 也包括几部分:

  1. 下拉菜单的最顶部, 对应显示部分如下图:
    这部分对应的源码是: QuickStatusBarHeader.java, 实现了BaseStatusBarHeader接口
    对应的布局文件是: quick_status_bar_expanded_header.xml
    包含如下这些元素:
    R.id.header_emergency_calls_only
    R.id.edit
    R.id.date_time_alarm_group
    R.id.expand_indicator
    R.id.quick_qs_panel
    R.id.settings_button
    R.id.alarm_status
    R.id.multi_user_switch

  2. 如下部分, 是第一步下拉后, 出现的快捷按钮

    这部分对应的源码是: QuickQSPanel.java
    它的作用是只在QS最上面显示一行快捷图标

  3. 下拉菜单的其他部分:

  4. 两个重要的对象
    QSPanel
      是一个LinearLayout. 所有快捷设置开关, 亮度调节条等, 都包含在QSPanel中. 如果
     要添加其它的界面元素, 比如音量调节条和收起按钮等, 也添加在QSPanel中
    NotificationPanelView
      是一个FrameLayout. 主要处理下拉菜单界面变动事件, 包括对Touch事件的处理.
     对下拉菜单从两次下拉改为单次下拉,在onTouchEvent里面修改

3. 系统通知信息

 StatusBar的重要功能之一是显示系统通知消息
 它通过NotificationListenerService来获得系统通知消息.
  具体实现是在BaseStatusBar, 通过创建并且注册NotificationListenerService实例实现
 监听通知栏消息, PhoneStatusBar继承了这个机制.
 在BaseStatusBar的start函数中
  //注册了一个系统service,监听Notification消息
  mNotificationListener.registerAsSystemService
  如果不需要显示系统通知, 理论上将这句代码注释掉即可

4. 下拉菜单事件处理

PhoneStatusBar
//处理touch消息
interceptTouchEvent
//收到WORK_CHALLENGE_UNLOCKED_NOTIFICATION_ACTION消息
//由startWorkChallengeIfNecessary发出
onWorkChallengeUnlocked

NotificationPanelView
 //当下拉状态栏时,首先收到如下消息
 onTouchEvent, 如果需要修改下拉菜单对触摸事件的响应,可以在这个函数中修改,比如将
 两次下拉修改为单次下拉

NotificationPanelView继承了PanelView,
PanelView实现了expand/collapse的动画效果,
PanelView继承了FrameLayout

其他的一些比较重要的文件

Android资源文件目录res下的layout目录下的xml文件, 是将UI组件组合起来的一种方式.

PhoneStatusBar包括:
KeyguardUserSwitcher
KeyguardMonitor
LockscreenWallpaper
StatusBarWindowView ( R.layout.super_status_bar )
PhoneStatusBarView ( R.id.status_bar status_bar.xml)
StatusBarWindowManager
DozeServiceHost
NotificationPanelView ( R.id.notification_panel )
AutoReinflateContainer( R.id.qs_auto_reinflate_container )
QSPanel( qs_panel.xml )
BaseStatusBarHeader
KeyguardStatusBarView
KeyguardBottomAreaView

系统栏下拉菜单的一大功能当然是快捷设置开关, 如下:
BluetoothControllerImpl
SecurityControllerImpl
BatteryController
LocationControllerImpl
NetworkControllerImpl
HotspotControllerImpl
RotationLockControllerImpl
UserInfoController
ZenModeController
CastControllerImpl
VolumeComponent
FlashlightController
UserSwitcherController
NextAlarmController
BrightnessMirrorController
AccessibilityController
FingerprintUnlockController
LightStatusBarController
KeyguardIndicationController

参考

以下是对NotificationListenerService的说明

  1. NotificationListenerService的定义
    A service that receives calls from the system when new notifications are posted or removed, or their ranking changed.
  2. 具体用法, 参考