不需要 Window,改变状态栏颜色

6

我想在后台中操作状态栏(例如颜色)。我使用前台服务来实现这一点。因此,由于是在后台进行操作,没有窗口,特别是没有活动。但是,该功能

public abstract void setStatusBarColor (int color)

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

由于它是抽象的,我不能初始化它,也不能像实现activity类那样使用getWindow()。 以下答案使用Activity。是否有其他方法来实现这个呢? 如何在Android中更改状态栏颜色


你是指后台线程而不是后台进程,对吧?进程和线程有些不同。https://developer.android.com/guide/components/processes-and-threads.html你可以在UI线程上实例化一个handler,并从后台线程发布一个runnable,在UI线程上使用handler的handleMessage()方法更改颜色。 - Thracian
具体来说,我正在使用前台服务。服务不是线程。@Thracian 对于误解我感到抱歉。 - Sarah cartenz
没问题。您仍然可以在Service中使用Handler,或者使用BroadcastReceiver与Service一起在Activity中进行监听。https://dev59.com/9Gox5IYBdhLWcg3wnVey - Thracian
@Thracian 我确实在使用带有Service的BroadcastReceiver,但是你所说的在Activity中监听是什么意思?你能给我一个例子吗?我实际上正在使用React-native编写我的应用程序,但是我正在使用他们提供的本地模块来实现一些本地代码。在onReceive函数内部操作状态栏是否可能? - Sarah cartenz
我将我的代码添加到onReceive中,状态栏颜色发生了变化,但只有在应用程序在前台时才会改变,当它被发送到后台时,颜色会消失。 - Sarah cartenz
显示剩余3条评论
1个回答

5
所以因为它(`setStatusBarColor()`)是抽象的,我不能初始化它,也不能使用`getWindow()`。
您不应该自己创建`Window`类的实例,而是应该从框架中获取,具体来说是从活动中获取。只要您没有活动,就无法引用`Window`实例。
假设您的应用程序进程不在前台(即没有任何可见的活动),那么您将无法更改状态栏的颜色。
想象一下,如果框架允许这样做,那么恶意应用程序可能会滥用此功能,在用户甚至没有打开恶意应用程序的情况下每秒钟随机更改状态栏颜色。我认为这将被视为缺陷,而不是功能。

谢谢您的回答。然而,安卓的美妙之处在于它是开源的。许多安卓功能如果你想的话都可以被滥用。但这并不意味着它们应该被删除或类似的事情。另一方面,恶意应用程序则可以从手机中删除。起初我想要操纵图标的颜色,但是新设计要求所有图标都是白色的,所以我想到状态栏,还有其他的想法吗? - Sarah cartenz
也许 windowLightStatusBar 可以适合你的使用情况。 - azizbekian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接