Изменить цвет строки состояния без окна

Я хочу манипулировать строкой состояния (например, цветом), но в фоновом режиме. Для этого я использую службу переднего плана. Таким образом, нет окна, как это происходит в фоновом режиме, в частности, нет активности. Однако функция

public abstract void setStatusBarColor (int color)

вызывается абстрактным классом Window: https://developer.android.com/reference/android/view/Window.html

И поэтому, поскольку он абстрактный, я не могу его инициировать и не могу использовать getWindow(), поскольку я не реализую класс активности. В следующем ответе используется Activity. Есть ли другой способ реализовать это? Как изменить цвет строки состояния в Android


person Sarah cartenz    schedule 25.01.2018    source источник
comment
Вы имеете в виду фоновый поток под фоновым процессом, верно? Процесс несколько отличается от потока. developer.android.com/guide/components/ Вы можете используйте обработчик, созданный в потоке пользовательского интерфейса, и отправьте исполняемый файл из фонового потока и измените цвет в потоке пользовательского интерфейса с помощью метода handleMessage() обработчика.   -  person Thracian    schedule 28.01.2018
comment
В частности, я использую службу переднего плана. Сервис — это не поток. @Thracian Извините за недоразумение.   -  person Sarah cartenz    schedule 28.01.2018
comment
Все нормально. Вы по-прежнему можете использовать Handler со службой или использовать BroadcastReceiver со службой и слушать в Activity. stackoverflow.com/questions/9092134/   -  person Thracian    schedule 28.01.2018
comment
@Thracian Я действительно использую BroadcastReceiver с сервисом, но что вы подразумеваете под прослушиванием в Activity? Не могли бы вы привести пример? На самом деле я пишу свое приложение на React-native, но использую собственный модуль, который они предоставили, для реализации некоторого собственного кода. Можно ли манипулировать строкой состояния внутри функции onReceive?   -  person Sarah cartenz    schedule 28.01.2018
comment
Я добавил свой код внутри onReceive, цвет строки состояния изменился, но только тогда, когда приложение было на переднем плане, когда оно было отправлено на задний план, цвет ушел.   -  person Sarah cartenz    schedule 28.01.2018
comment
Интересно вернуться после того, как ваше приложение было приостановлено. Обычный жизненный цикл, когда приложение приостанавливается, отправляется на задний план и возвращается на экран: onPause() -> onStop() -> onStart() -> onResume(). Если вы устанавливаете цвет в onStart() или onResume(), он может вернуться к цвету по умолчанию. Вы также можете сохранить текущий цвет StatusBar в методе SharedPreferences или onSaveInstance(). Также цвет строки состояния не требует окна. Получите экземпляр строки состояния внутри действия и измените его с помощью метода statusbar.setColor().   -  person Thracian    schedule 28.01.2018
comment
Вы измените цвет внутри внутри метода onReceive() BroadcastReceiver внутри вашей деятельности без окна. Получите экземпляр строки состояния с помощью findViewById или другой привязки, затем измените его цвет в onReceive()   -  person Thracian    schedule 28.01.2018
comment
@Thracian Я не могу найти метод statusbar.setColor(), не могли бы вы дать мне ссылку, пожалуйста?   -  person Sarah cartenz    schedule 28.01.2018


Ответы (1)


И поэтому, поскольку он (setStatusBarColor()) абстрактный, я не могу его инициировать и не могу использовать getWindow()

Вы не должны не создавать экземпляр класса Window самостоятельно, это то, что вы должны получить из фреймворка, в частности, из активности. Пока у вас нет активности, вы не сможете получить ссылку на экземпляр Window.

Предполагая, что процесс вашего приложения не находится на переднем плане (т. е. нет никакой видимой активности), у вас нет возможности изменить цвет строки состояния.

Представьте, что фреймворк позволяет делать такие вещи, тогда он может быть неправильно использован вредоносными приложениями для случайного изменения цвета строки состояния каждую секунду, когда пользователь даже не открыл вредоносное приложение. Думаю, это будет считаться недостатком, а не особенностью.

person azizbekian    schedule 28.01.2018
comment
Спасибо за ваш ответ. Однако красота Android в том, что его исходный код открыт. Многие функции Android можно использовать не по назначению, если подумать. это не означает, что они должны быть удалены или аналогичным образом. С другой стороны, вредоносное приложение может быть удалено с телефона. Изначально я хотел изменить цвет значка, но новый дизайн требует, чтобы все значки были белыми, поэтому я подумал о строке состояния, есть другие идеи? - person Sarah cartenz; 28.01.2018
comment
Может windowLightStatusBar соответствовать вашему варианту использования. - person azizbekian; 29.01.2018