在没有窗口的情况下更改状态栏颜色

Posted

技术标签:

【中文标题】在没有窗口的情况下更改状态栏颜色【英文标题】:Change status bar color without having Window 【发布时间】:2018-07-04 21:47:24 【问题描述】:

我想在后台操作状态栏(例如颜色)。我正在使用前台服务来执行此操作。因此没有窗口,因为它在后台发生,特别是没有活动。但是,函数

public abstract void setStatusBarColor (int color)

被抽象类Window调用:https://developer.android.com/reference/android/view/Window.html

因为它是抽象的,所以我无法启动它,也无法使用 getWindow(),因为我没有实现活动类。 以下答案使用活动。还有其他方法可以实现吗? How to change the status bar color in android

【问题讨论】:

你的意思是后台进程的后台线程,对吧?进程与线程有些不同。 developer.android.com/guide/components/… 您可以使用在 UI 线程上实例化的处理程序并从后台线程发布可运行的对象,并使用处理程序的 handleMessage() 方法在 UI 线程上更改颜色。 特别是我正在使用前台服务。服务不是线程。 @Thracian 抱歉造成误会。 没关系。您仍然可以将 Handler 与 Service 一起使用,或者将 BroadcastReceiver 与 Service 一起使用并在 Activity 中侦听。 ***.com/questions/9092134/… @Thracian 我确实在使用带有服务的广播接收器,但是在活动中收听是什么意思?你能给我一个例子吗?我实际上是在 React-native 中编写我的应用程序,但正在使用他们提供的本机模块来实现一些本机代码。是否可以在 onReceive 函数中操作状态栏? 我在 onReceive 中添加了我的代码,状态栏颜色发生了变化,但只有当应用程序处于前台时,当它被发送到后台时,颜色才会消失。 【参考方案1】:

所以因为它 (setStatusBarColor()) 是抽象的,我无法启动它,也无法使用 getWindow()

您应该自己创建Window 类的实例,那就是 您应该从框架中获取的东西,特别是从活动中获取的东西。 只要您没有有活动,就无法获得对 Window 实例。

假设您的应用程序的进程在前台(即没有任何可见的活动), 那么你就没有办法改变状态栏的颜色了。

想象一下框架允许做这样的事情,那么它可能会被滥用 恶意应用程序每秒随机更改状态栏颜色,当用户甚至没有 打开恶意应用程序。我认为这将被视为缺陷,而不是功能。

【讨论】:

感谢您的回答。然而,android 的美妙之处在于它的开源。如果您考虑一下,许多 Android 功能可能会被滥用。这并不意味着它们应该被删除或类似地删除。另一方面,恶意应用程序可以从手机中删除。最初我想控制图标的颜色,但新设计要求所有图标都是白色的,所以我想到了状态栏,还有其他想法吗? May windowLightStatusBar 将适合您的用例。

以上是关于在没有窗口的情况下更改状态栏颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何根据设置的主题更改颤动中的状态栏图标和文本颜色?

在 iOS 中与 InAppBrowser 插件一起使用时如何更改状态栏颜色?

更改状态栏的背景颜色

更改状态栏色调颜色

如何根据前景图像在android中动态更改状态栏的颜色?

Flutter-如何在深色模式下更改状态栏文字颜色?