systemui状态栏添加新图标

本文详细介绍了如何在Android系统中自定义状态栏右侧图标,并根据广播更新。首先,在frameworks/base/core/res/res/values/config.xml中定义新图标xiguatong并插入到适当位置。然后,在symbols.xml中添加对应ID。接着,在SystemUI的PhoneStatusBarPolicy.java文件中初始化和控制新图标的状态。遗留问题包括图标添加的具体流程、左侧图标添加方法以及不同状态栏图标显示的控制逻辑。
状态栏右侧添加新图标
需求描述

在状态栏右边添加一个自定义图标,根据广播更新图标。

代码实现

framework部分修改
frameworks/base/core/res/res/values/config.xml最上方config_statusBarIcons。原生注释写的很清楚了,用不要钱的翻译翻译一下:
不要翻译。
定义右侧图标的插槽。
也就是状态栏里不是通知的图标
1、config_statusBarIcons数组里添加自定义图标xiguatong
2、在下方添加string xiguatong
frameworks/base/core/res/res/values/config.xml中config_statusBarIcons的顺序表示右侧状态栏图标的顺序,我们在电量图标前面加了一个xiguatong

<!-- Do not translate. Defines the slots for the right-hand side icons.  That is to say, the
         icons in the status bar that are not notifications. -->
    <string-array name="config_statusBarIcons">
        <item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_rotate</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_headset</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_data_saver</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_ime</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_sync_failing</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_sync_active</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_nfc</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_tty</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_speakerphone</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_cdma_eri</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_data_connection</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_phone_evdo_signal</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_phone_signal</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_secure</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_cast</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_screen_record</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_vpn</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_camera</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_microphone</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_location</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_mute</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_volume</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_zen</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_ethernet</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_wifi</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_hotspot</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_mobile</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_airplane</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_xiguatong</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_battery</xliff:g></item>
        <item><xliff:g id="id">@string/status_bar_sensors_off</xliff:g></item>
    </string-array>
	<string translatable="false" name="status_bar_xiguatong">xiguatong</string>
    <string translatable="false" name="status_bar_rotate">rotate</string>
    <string translatable="false" name="status_bar_headset">headset</string>
    <string translatable="false" name="status_bar_data_saver">data_saver</string>
    <string translatable="false" name="status_bar_managed_profile">managed_profile</string>
    <string translatable="false" name="status_bar_ime">ime</string>
    <string translatable="false" name="status_bar_sync_failing">sync_failing</string>
    <string translatable="false" name="status_bar_sync_active">sync_active</string>
    <string translatable="false" name="status_bar_cast">cast</string>
    <string translatable="false" name="status_bar_hotspot">hotspot</string>
    <string translatable="false" name="status_bar_location">location</string>
    <string translatable="false" name="status_bar_bluetooth">bluetooth</string>
    <string translatable="false" name="status_bar_nfc">nfc</string>
    <string translatable="false" name="status_bar_tty">tty</string>
    <string translatable="false" name="status_bar_speakerphone">speakerphone</string>
    <string translatable="false" name="status_bar_zen">zen</string>
    <string translatable="false" name="status_bar_mute">mute</string>
    <string translatable="false" name="status_bar_volume">volume</string>
    <string translatable="false" name="status_bar_wifi">wifi</string>
    <string translatable="false" name="status_bar_cdma_eri">cdma_eri</string>
    <string translatable="false" name="status_bar_data_connection">data_connection</string>
    <string translatable="false" name="status_bar_phone_evdo_signal">phone_evdo_signal</string>
    <string translatable="false" name="status_bar_phone_signal">phone_signal</string>
    <string translatable="false" name="status_bar_battery">battery</string>
    <string translatable="false" name="status_bar_alarm_clock">alarm_clock</string>
    <string translatable="false" name="status_bar_secure">secure</string>
    <string translatable="false" name="status_bar_clock">clock</string>
    <string translatable="false" name="status_bar_mobile">mobile</string>
    <string translatable="false" name="status_bar_vpn">vpn</string>
    <string translatable="false" name="status_bar_ethernet">ethernet</string>
    <string translatable="false" name="status_bar_microphone">microphone</string>
    <string translatable="false" name="status_bar_camera">camera</string>
    <string translatable="false" name="status_bar_airplane">airplane</string>
    <string translatable="false" name="status_bar_sensors_off">sensors_off</string>
    <string translatable="false" name="status_bar_screen_record">screen_record</string>

frameworks/base/core/res/res/values/symbols.xml中添加xiguatong id,不然引用不到资源

  <java-symbol type="string" name="status_bar_xiguatong" />
  <java-symbol type="string" name="status_bar_battery" />

systemui部分
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java

private final StatusBarIconController mIconController;//状态栏图标控制器
//自己加的西瓜桶图标
private final String mXiGuaTong;
private boolean mXiGuaTongVisible;
@Inject
public PhoneStatusBarPolicy(...){
	...
	//
	mXiGuaTong = resources.getString(com.android.internal.R.string.status_bar_xiguatong);
	mXiGuaTongVisible = true;
	...
}
public void init() {
	...
	//xiGuaTong:字符串,图片,按钮描述
	mIconController.setIcon(mXiGuaTong, R.drawable.stat_sys_xiguatong,null);
	//设置图片可见不可见:字符串,Boolean值
	mIconController.setIconVisibility(mXiGuaTong, mXiGuaTongVisible);
	...
}

以上,就可以在状态栏右侧添加新图标。

遗留问题

1、图标是怎么加到状态栏右边的,完整流程?
2、状态栏左边怎么加图标?
3、状态栏、下拉状态栏、2次下拉状态栏、锁屏、这几种状态下状态栏图标会有变化,是哪里控制的?

<think> 嗯,用户想了解SystemUI状态栏左侧应用图标显示的控制流程。这个问题涉及Android系统UI的底层实现,看来用户可能是Android系统开发者或ROM定制人员。 参考提供的三个引用材料来看,关键点集中在StatusBarIconController这个类和其调用流程。引用[1]明确了状态栏左侧区域专门显示应用图标类通知;引用[2]提到布局文件由QuickStatusBarHeader.java控制;引用[3]则直接指出了createIconController()这个入口方法。 需要特别注意:用户上次的问题也聚焦在控制流程上,但这次更具体到"左侧应用图标"。因此回答应该跳过通用状态栏知识,直奔主题。另外用户提供的引用[3]中makeStatusBarView()-->createIconController()这个调用链很重要,需要展开说明。 核心流程应该分三层:首先是初始化阶段StatusBarIconController的创建(对应引用[3]),然后是布局文件如何关联图标区域(对应引用[2]),最后是具体图标添加/更机制。考虑到用户可能进行ROM定制,应该强调可扩展点,比如自定义图标需要继承StatusBarIcon类。 用户没有提问相关问题,但根据系统指令需要生成三个。考虑到开发者需求,问题应该围绕扩展开发(如添加自定义图标)、异常排查(图标不显示)和设计原理展开比较实用。 </think> SystemUI 状态栏左侧应用图标显示的控制流程主要涉及 `StatusBarIconController` 及其相关类,核心流程如下: ### 1. **初始化图标控制器 (`StatusBarIconController`)** - 在 `StatusBar.makeStatusBarView()` 方法中调用 `createIconController()` [^3]: ```java protected void createIconController() { mIconController = new StatusBarIconController( mContext, mStatusBarView, mKeyguardStatusBar, this ); } ``` - `StatusBarIconController` 负责管理所有系统图标(包括左侧区域)的生命周期和布局。 ### 2. **图标区域布局绑定** - 左侧图标容器定义在布局文件 `quick_status_bar_header_system_icons.xml` 中(通常为 `StatusIconContainer` 类型)[^1][^2]。 - `StatusBarIconController` 在初始化时会绑定该容器: ```java // 伪代码:绑定左侧图标容器 ViewGroup leftIconArea = mStatusBarView.findViewById(R.id.status_icon_container); mIconController.addIconGroup(leftIconArea); ``` ### 3. **图标添加与更流程** - **添加图标**:当系统服务(如 `NotificationManagerService`)收到通知时,通过 `CommandQueue` 调用 `addSystemIcon()`: ```java mCommandQueue.addCallback(new Callback() { @Override public void setIcon(String slot, StatusBarIcon icon) { mIconController.setIcon(slot, icon); } }); ``` - **更逻辑**:`StatusBarIconController` 根据图标类型(如 `USB`/`DOWNLOAD`)和优先级,通过 `StatusIconContainer` 动态排序并渲染图标[^1]。 ### 4. **图标显示控制关键类** | **类名** | **职责** | **关键方法** | |---------------------------|----------------------------------------|----------------------------------| | `StatusBarIconController` | 统一管理图标状态和布局 | `setIcon()`, `removeIcon()` | | `StatusIconContainer` | 动态布局容器(处理排序、间距等) | `addStatusIcon()`, `onViewRemoved()` | | `StatusBarIconView` | 单个图标的视图实现(点击事件、动画等) | `applyIcon()` | ### 5. **自定义图标示例** 若要添加自定义图标(如 `CUSTOM_ICON`): ```java // 定义图标槽位 private static final String SLOT_CUSTOM = "custom_icon"; // 添加图标 StatusBarIcon customIcon = new StatusBarIcon( "com.example.package", iconResId, 0, // iconLevel "Custom Tip" ); mIconController.setIcon(SLOT_CUSTOM, customIcon); ``` > **流程图总结**: > `SystemService 通知` → `CommandQueue 传递` → `StatusBarIconController 处理` → `StatusIconContainer 动态布局` → `StatusBarIconView 渲染`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值