Android_5.0定制--------在Launcher界面改变SystemUI中的NavigationBar和StatusBar背景颜色

本文介绍Android系统中状态栏与导航栏的布局实现方式及其背景颜色的设置方法,包括源码路径和具体步骤。同时探讨如何在Launcher界面修改状态栏背景颜色,并解决设置不生效的问题。

SystemUI中的状态栏和导航栏在源码中的布局分别是:

     状态栏:super_status_bar.xml,源码路径:\frameworks\base\packages\SystemUI\res\layout\super_status_bar.xml

     导航栏:navigation_bar.xml,源码路径:\frameworks\base\packages\SystemUI\res\layout\navigation_bar.xml

StatusBar是怎样添加到屏幕上去的(NavigationBar也差不多,就记录一个StatusBar):

\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\PhoneStatusBar.java中有一个StatusBarWindowView对象和StatusBarWindowManager对象。  其中两个对象的主要作用分别是:

          StatusBarWindowView:通过View的inflate的静态方法将super_status_bar.xml实例化StatusBarWindowView的一个实例。(解析布文件)

          StatusBarWindowManager:StatusBarWindowManager中存在一个WindowManager,先通过StatusBarWindowManager的add方法将StatusBarWindowView传递给WindowManager,然后WindowManager通过addView方法将View添加到窗口上。(将View添加到窗口,也就是屏幕上)


上面就是大致StatusBar的添加到屏幕的过程。

下面说一下怎么设置StatusBar背景颜色:

我们是要在Launcher界面修改StatusBar背景颜色,Launcher也继承自Activity。一般情况下,Android系统给出了接口Window类里面有setNavigationBarColor和setStatusBarColor两个方法去设置状态栏和导航栏的背景颜色。Launcher的主题<style name="Theme" parent="@android:style/Theme.Holo.Wallpaper.NoTitleBar">,在Theme主题下添加<item name="android:windowDrawsSystemBarBackgrounds">true</item>属性。

在Launcher的onCreate方法中调用:

try {
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
				Window window = activity.getWindow();
				window.setStatusBarColor(Color.parseColor("#ff000000"));

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
发现编完成后将 apk Push到系统,发现状态栏背景颜色没有变成我们预期的颜色。跟踪源码发现,在Launcher.java类中有这么一段代码的调用:

  private void setupTransparentSystemBarsForLmp() {
        // TODO(sansid): use the APIs directly when compiling against L sdk.
        // Currently we use reflection to access the flags and the API to set the transparency
        // on the System bars.
        if (Utilities.isLmpOrAbove()) {
            try {
                getWindow().getAttributes().systemUiVisibility |=
                        (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                        | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                Field drawsSysBackgroundsField = WindowManager.LayoutParams.class.getField(
                        "FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS");
                getWindow().addFlags(drawsSysBackgroundsField.getInt(null));

                Method setStatusBarColorMethod =
                        Window.class.getDeclaredMethod("setStatusBarColor", int.class);
                Method setNavigationBarColorMethod =
                        Window.class.getDeclaredMethod("setNavigationBarColor", int.class);
                setStatusBarColorMethod.invoke(getWindow(), Color.TRANSPARENT);
                setNavigationBarColorMethod.invoke(getWindow(), Color.TRANSPARENT);
            } catch (NoSuchFieldException e) {
                Log.w(TAG, "NoSuchFieldException while setting up transparent bars");
            } catch (NoSuchMethodException ex) {
                Log.w(TAG, "NoSuchMethodException while setting up transparent bars");
            } catch (IllegalAccessException e) {
                Log.w(TAG, "IllegalAccessException while setting up transparent bars");
            } catch (IllegalArgumentException e) {
                Log.w(TAG, "IllegalArgumentException while setting up transparent bars");
            } catch (InvocationTargetException e) {
                Log.w(TAG, "InvocationTargetException while setting up transparent bars");
            } finally {}
        }
    }
这段代码就是系统利用反射机制调用Window中的setStatusBarColor方法,将状态栏的背景设置成透明。可以在该方法中做适当的处理,让前面设置的背景颜色就起作用了。

`ActivityManagerService (AMS)` `SystemUI` / `Launcher` 进程**并不运行在同一个进程中**,它们是 Android 系统中不同的组件,分别运行在独立的系统进程中。下面我们详细解释它们的关系运行位置。 --- ### ✅ 1. **ActivityManagerService (AMS)** - **作用**:AMS 是 Android 框架层的核心服务之一,负责管理所有应用的 Activity 生命周期、任务栈、进程调度、启动流程等。 - **运行位置**:它运行在 **`system_server`** 进程中。 - **进程名示例**:`system_server` - **PID**:通常在系统启动时由 Zygote 创建,拥有固定的 PID(如 1000 左右)。 ```bash # 查看 system_server 进程 adb shell ps | grep system_server ``` AMS 是一个 **系统服务(SystemService)**,由 `SystemServer.java` 启动,属于 Binder 服务端,供其他进程通过 AIDL 调用。 --- ### ✅ 2. **SystemUI** - **作用**:负责系统的用户界面部分,如状态栏StatusBar)、导航栏NavigationBar)、锁屏、通知面板、电量提示等。 - **运行位置**:运行在独立的进程 —— `com.android.systemui` - **进程名示例**:`com.android.systemui` - **启动方式**:由 `SystemServer` 启动 AMS 后,AMS 根据配置启动 SystemUI 应用。 ```bash # 查看 SystemUI 进程 adb shell ps | grep systemui ``` SystemUI 是一个普通的 Android **应用进程**,但它拥有系统权限(signature|system 权限),可以访问系统资源。 --- ### ✅ 3. **Launcher** - **作用**:桌面应用,显示应用图标、处理点击启动 App、管理主屏等。 - **运行位置**:运行在自己的进程,通常是 `com.android.launcher` 或 OEM 厂商定制的包名(如 `com.google.android.apps.nexuslauncher`)。 - **本质**:是一个普通的 Android 应用,但被设置为默认 Home Activity。 ```bash # 查看 Launcher 进程(以 Pixel 手机为例) adb shell ps | grep launcher ``` Launcher 被 AMS 管理,当用户点击桌面图标时,Launcher 通过 AMS 请求启动目标应用。 --- ### 🔗 它们之间的关系 | 组件 | 进程 | 依赖关系 | |------|------|----------| | AMS | `system_server` | 核心服务,运行在系统进程 | | SystemUI | `com.android.systemui` | 通过 AMS 启动,调用 AMS API 控制窗口/状态 | | Launcher | `com.android.launcher...` | 通过 AMS 启动 App,响应用户操作 | > ✅ 所有组件都通过 **Binder IPC** 与 AMS 通信,但它们**不在同一进程**。 --- ### 🧪 示例:查看这些进程 ```bash # 查看所有关键进程 adb shell ps -A | grep -E "(system_server|systemui|launcher)" ``` 输出示例: ``` system_server ... 1000 ... com.android.server.SystemServer u0_a45 ... 1234 ... com.android.systemui u0_a57 ... 1357 ... com.google.android.apps.nexuslauncher ``` 可以看到它们有不同的 UID PID,说明是不同进程。 --- ### ❌ 常见误解澄清 - ❌ “AMS 在 SystemUI 里” → 错!AMS 在 `system_server`。 - ❌ “Launcher 管理 AMS” → 错!Launcher 反而被 AMS 管理。 - ✅ “SystemUI Launcher 都依赖 AMS” → 正确! --- ### 总结 | 名称 | 所在进程 | 类型 | 是否独立进程 | |------|---------|------|---------------| | AMS | `system_server` | 系统服务 | 是(核心系统进程) | | SystemUI | `com.android.systemui` | 系统应用 | 是 | | Launcher | `com.android.launcher...` | 桌面应用 | 是 | 👉 因此:**AMS、SystemUILauncher 都运行在不同的进程中**,通过 Binder 机制进行跨进程通信(IPC)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值