通知栏修改

          目录

通知栏启动流程... 2

通知栏布局结构... 3

三.通知栏修改点... 4

3.1.通知栏通知条底色修改。... 5

3.2.通知栏横竖屏切换... 5

3.3.通知栏底部按钮切换实现(通知和设置两个界面)... 5

四.通知栏如何加入系统... 6

五.总结... 8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

通知栏启动流程

  1. 首先我们需要知道通知栏是通过那个服务启动的,打开文件SystemUI/AndroidManifest.xml,可以看到代码中注册了很多Service,在这里我们只关心SystemUIService,通过查找SystemUIService搜索到SystemServer中启动了该服务。
  2. 系统启动SystemServer服务,初始化了Android系统中的Java层服务,如PowerManagerService,WindowManagerService等等,当然也包括SystemUIService。
  3. SystemServer中调用startSystemUi方法启动SystemUIService,startSystemUi中首先调用方法hasSystemNavBar()判断当前设备是手机还是平板,因为此前修改的都是手机,故目前只针对手机进行说明。
  4. 识别到手机后,实例化手机启动类:

com/android/systemui/statusbar/phone/PhoneStatusBar.java,通过调用PhoneStatusBar中的start()方法,开始创建通知栏组件。

  1. PhoneStatusBar.java start()方法中我们重心主要是在super.start() 。super.start()表示调用父类start()方法,也就是BaseStatusBar.java中的start()方法,该方法中主要获取通知栏需要的一些服务以及初始化变量,并且可以看到方法中调用了createAndAddWindows()方法,而在BaseStatusBar.java类中该方法定义的是抽象方法,该方法被子类PhoneStatusBar.java继承并且实现,所以实际上调用的PhoneStatusBar.java中的createAndAddWindows,通过该方法调用addStatusBarWindow(),

addStatusBarWindow()中调用makeStatusBarView(),最后在

makeStatusBarView()中加载通知栏布局,完成通知栏初始化。

整个调用过程如下:

PhoneStatusBar.start()->super.start()->BaseStatusBar.start()->BaseStatusBar .createAndAddWindows()->

PhoneStatusBar.createAndAddWindows()->PhoneStatusBar .addStatusBarWindow()->PhoneStatusBar .makeStatusBarView

 

 

 

 

通知栏布局结构

通知栏从从提来看分为:

Statusbar(状态栏)和NavigationBar(导航条)

由于4.2上面NavigationBar未使用,所以目前只介绍Statusbar。

Statusbar由两部分组成,如图1.1所示:

 

 

状态栏(gemini_super_status_bar.xml)

 

                     

 

 

 
   

 

 

 

 

 

 

可拖动的下拉条

(gemini_status_bar_expanded)

 

 

顶部状态条 

(gemini_status_bar.xml)

 

                 

 

        

 

 

 

                    图 1.1

  1. 顶部状态栏 (gemini_status_bar.xml)整个是一个自定义的类实现:

com.android.systemui.statusbar.phone.PhoneStatusBarView

PhoneStatusBarView构成:

PhoneStatusBarView又细分成两个大模块,分别是icons和ticker两个布局。我们知道,在通常情况下,系统左边放置通知图标(notificationIcons),中间放置状态图标(statusIcons)以及信号图标(signal_battery_cluster),右边放置日期(clock), ticker是有消息通知时顶部状态栏滚动提示的界面,默认是看不见的,因此实际上我们真正看到的StatusBar是icons的布局。

 

(2) 通知部分(gemini_status_bar_expanded.xml)   

 在android4.1以后通知部分分为了四个部分:顶部显示时间日期界面,通知界面,设置界面以及运营商显示界面,其中通知界面和设置界面通过按钮进行切换。

gemini_status_bar_expanded.xml包含以下内容:

status_bar_expanded_header.xml顶部显示日期界面

flip_settings.xml 设置界面

gemini_carrier_label.xml 运营商界面

NotificationRowLayout .java显示系统通知界面  

三.通知栏修改点

目前我们主要针对通知栏整体布局以及颜色风格修改,在此主要列举我前面修改较大的点:

3.1.通知栏通知条底色修改。

此修改主要修改底层布局文件,在Android发送通知过程中,针对应用可以自定义通知的布局,如果有自定义布局则系统加载你所定义好的布局显示,如果未定义通知布局系统会加载底层定义好的布局显示。因为通知的布局可能会有所不同,比如有的需要加按钮操作,有的需要显示图片,所以说布局文件有多种,目前修改的底层通知布局文件主要有以下几种:

   notification_template_base.xml   

   notification_template_big_base.xml

notification_template_big_picture.xml

notification_template_big_text.xml

notification_template_inbox.xml

 其中第一种为最常见的布局也就是只有一条通知文字显示,没有其它控件,后面几种是针对某些特殊用途的通知,比如说有进度条的通知,需要按钮操作的通知,具体需要哪一种请查看上述布局的具体内容。以上文件目录为:

project/alps/frameworks/base/core/res/res/layout/

如果需要更改通知布局以及颜色则需要根据通知具体显示的布局来查找相应布局修改。

    注意:某些布局是自定义的所以不使用上述布局,比如:music应用就是使用自定义布局显示(newstatusbar.xml)。

   3.2.通知栏横竖屏切换

   由于在修改通知栏时,通知栏默认不支持(layout-port和layout-land),所以我的处理办法是在PhoneStatusBar中重写方法onConfigurationChanged(),当手机横竖屏切换时会调用该方法,在该方法中对通知栏布局参数进行调整,具体可参考72平台VivoLightSystemUI中该方法的实现。

   上面方法是通知栏不支持(layout-port和layout-land)情况下使用的,如果最新版本已经支持(layout-port和layout-land)方式,我们只需要修改对应布局来实现横竖屏的切换。

    3.3.通知栏底部按钮切换实现(通知和设置两个界面)

    以72平台VivoLightSystemUI为例:

(1).首先在通知栏主界面增加两个开关按钮mSwitch_view_button和mNotification_view_buttton。

(2).为这两个按钮添加事件

     mSwitch_view_button.setOnClickListener()

 mNotification_view_buttton.setOnClickListener()

事件中分别调用flipToNotifications()和flipToSettings()来实现界面的切换。

(3).实现思路是将两个界面根据按钮切换来设置可见或不可见,也就是在flipToNotifications()和flipToSettings()方法中设置切换View的:View.setVisibility(),加入界面切换的动画来实现切换效果。

详细代码请参考:

bird/mmi/bird_app/VivoLightSystemUI/src/com/android/systemui/statusbar/phone/ PhoneStatusBar.java

(4).如何向设置界面增加功能按钮

通知栏中设置界面是通过一个ViewGroup显示整个设置界面,并且是可以动态添加的,主要有以下几步(以wifi按钮为例):

  1. 自定义QuickSettingsContainerView。

com.android.systemui.statusbar.phone.QuickSettingsContainerView,继承FrameLayout,而FrameLayout继承自ViewGroup。

  1. 创建按钮实例,使用inflater.inflate加载模板类

final QuickSettingsTileView wifiTile = (QuickSettingsTileView)

inflater.inflate(R.layout.quick_settings_tile, parent, false);相当于一个按钮模板,每个按钮都具备该类中的属性,然后

wifiTile.setContent(R.layout.quick_settings_tile_wifi, inflater);

为wifiTile创建自定义布局,来显示图标以及文字。详细代码请参考:

VivoLightSystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java

     c.最后为该对象(wifiTile)加上所要实现的事件,具体事件要根据按钮功能来定,比如wifi需要点击事件(),长按事件,当然

查看代码发现此处的wifi点击事件传递到

mQuickSettingsConnectionModel

类中进行了处理,详细如何调用请查看源码。

四.通知栏如何加入系统

        我们修改好的通知栏为了跟系统通知栏保持互相独立就需

要重新独立出来一个通知栏,使用宏进行控制,如果打开该宏则用修改的通知栏替换系统原始通知栏,如果关闭则保留系统原始通知栏。

  下面以72平台独立通知栏为例:

原始通知栏目录:

BIRD72_WET_B_JB3_V2/alps/frameworks/base/packages/SystemUI

需要独立通知栏目录:

BIRD72_WET_B_JB3_V2/bird/mmi/bird_app

(1).首先将我们修改好的通知栏整包放入bird/mmi/bird_app目

录下,这里名称为:VivoLightSystemUI

(2).定义控制该通知栏显示的宏

#仿vivo通知栏界面

# yes:open no:close

# 分辨率支持: 480x854 480x800 480x320

# 外文支持:英文/葡萄牙语/西班牙语/俄语

BIRD_VIVO_SYSTEM_UI_SUPPORT = no

      BIRD_VIVO_SYSTEM_UI_SUPPORT的值决定该宏是否打开,

配置yes or no。

(3)需要配置一下文件:

1)./bird/alps/build/target/product/common.mk文件加入以下代码:

ifeq ($(strip $(BIRD_VIVO_SYSTEM_UI_SUPPORT)), yes)

PRODUCT_PACKAGES += VivoLightSystemUI

Endif

     2).bird/mmi/bird_app/VivoLightSystemUI Android.mk代码外层加入

   ifeq ($(BIRD_VIVO_SYSTEM_UI_SUPPORT),yes)……endif

   注意:LOCAL_PACKAGE_NAME需要配置为你定义的应用名称,例如:VivoLightSystemUI

3).bird/alps/frameworks/base/packages/SystemUI/Android.mk

     代码外层加入

     ifneq ($(BIRD_VIVO_SYSTEM_UI_SUPPORT),yes)……endif

4).在bird/alps/mediatek/build/tools/javaoption.pm文件中声明该宏

(4).最后如果需要使用该通知栏,则需要在工程mk文件中加入该宏定义并且打开。

 

 

五.总结

    以上是我自修改通知栏(systemui)代码以来的一些经验,

了通知栏的大体框架以及局部的一些修改,如果需要深入学习通知栏

的内容,需要好好看看Systemui源码,通过不断熟悉代码来充分了解

和掌握通知栏修改的知识点

 

 

 

 

    

 

你可能感兴趣的:(android,手机,手机,android,状态栏)