即使不在前景中,您如何更改导航栏背景(不仅仅是颜色)?

How do you change the nav-bar background (not just color), even when not in foreground?

背景

应用程序“Navbar Apps”以某种方式允许自定义导航栏的背景,即使它不在前景中,甚至不仅仅是简单的颜色。

问题

我认为只有当应用程序在前台时才能更改它的颜色...

我在一些自定义rom上看到它,甚至在播放音乐时有特殊效果,但我不知道即使没有自定义rom(或root)也可以自定义它。

问题

  1. 这是黑客攻击吗?它们如何变化,不仅仅是导航栏的颜色,甚至还为其设置背景图像(包括动态图像,用于电池状态)?

  2. 是否也可以更改其他系统栏,比如通知栏?

  3. 它如何检查哪个应用程序在前台(可能需要根据当前应用程序决定何时更改颜色)?是新的 API 吗?我认为用于获取前景 activity 的 API 已被弃用,现在没有任何帮助...

基本设置非常简单。将其制作成应用程序需要一些工作。

您需要使用 Accessibility API 以及 WindowManager#addView(...).

Is it a hack?

我不能说我喜欢这个想法,但它不完全是 hack。

How do they change, not just the color of the navigation bar, but even set a background image for it (including dynamic one, for battery status) ?

由于我们添加了 View(或 ViewGroup),因此我们有更多的控制权。

Is it also possible to change other system bars, like the notification bar?

我会调查一下。

How does it check which app is in the foreground (needed for deciding when to change the color, based on current app, probably)?

您可以使用辅助功能 API 来监听 Window 级别变化 (AccessibilityEvent) - 这将为您提供 packageName。随心所欲地使用它。

我会给你一些建议:

清单:

  • 权限:SYSTEM_ALERT_WINDOW
  • 无障碍服务声明:<service />

无障碍服务

  • 膨胀、初始化并添加您的布局:onServiceConnected()
  • 我用 TYPE_SYSTEM_OVERLAYWindowManager#addView(...)
  • 收听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
  • 覆盖onAccessibilityEvent(AccessibilityEvent)packageName 将在此处可用

结果

此处托管示例项目:Link