name="AppTheme"
parent="
Theme.AppCompat.Light.DarkActionBar
">
name="colorPrimary">@color/colorPrimary
name="colorPrimaryDark">@color/colorPrimaryDark
name="colorAccent">@color/colorAccent
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
name="StrongBeatBoxButton"
parent="@style/BeatBoxButton">
- bold
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
...
name="AppTheme"
parent="Theme.AppCompat
.Light.DarkActionBar
">
...
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/
colorPrimaryred<
/item>
name="colorPrimaryDark">@color/
colorPrimary
Darkdark_red
name="colorAccent">@color/
colorAccentgray
item>
name="Theme.AppCompat"
parent="Base.Theme.AppCompat" />
Тема
Theme.AppCompat
наследует
атрибуты
от
Base.Theme.AppCompat
. Интересно, что
Theme.AppCompat
не
переопределяет никакие атрибуты, а только содержит ссылку
на своего родителя.
Щелкните мышью по
Base.Theme.AppCompat
с нажатой
клавишей (
Ctrl
). Android Studio сообщит, что тема уточняется
по ресурсам. Существует несколько разных версий этой темы в
зависимости от используемой версии Android.
name="Base.Theme.AppCompat"
parent="Base.V7.Theme.AppCompat">
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
-
androidx.appcompat.app.AppCompatVie
wInflater
- false
- true
name="windowActionBarOverlay">false
name="Platform.AppCompat"
parent="android:Theme.Holo">
name="android:windowNoTitle">true
name="android:windowActionBar">false
- ?
attr/buttonBarStyle
- ?
attr/buttonBarButtonStyle
name="android:borderlessButtonStyle">?
attr/borderlessButtonStyle
...
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
...
name="android:windowBackground">@color/backgrou
nd_material_dark
name="AppTheme"
parent="Theme.AppCompat">
- @color/red
name="colorPrimaryDark">@color/dark_red
- @color/gray
-
name="android:windowBackground">@color/soothing
_blue
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
...
name="buttonStyle">@style/Widget.AppCompat.Butt
on
name="buttonStyleSmall">@style/Widget.AppCompat
.Button.Small
...
name="Widget.AppCompat.Button"
parent="Base.Widget.AppCompat.Button"/>
Стиль
Widget.AppCompat.Button
самостоятельно никакие
атрибуты не определяет. Чтобы просмотреть его содержимое,
перейдите к его родителю. Вы увидите, что базовый стиль
существует
в
двух
версиях.
Выберите
версию
values/values.xml
.
name="Base.Widget.AppCompat.Button"
parent="android:Widget">
name="android:background">@drawable/abc_btn_def
ault_mtrl_shape
- ?
android:attr/textAppearanceButton
- 48dip
- 88dip
- true
- true
name="android:gravity">center_vertical|center_h
orizontal
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="colorPrimaryDark">@color/dark_red
name="colorAccent">@color/gray
name="android:windowBackground">@color/soothing
_blue
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@color/dark_bluem>
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@drawable/button_beat
_box_normal
-
name="android:background">@drawable/button_beat
_box
Отключение уведомлений при открытом приложении
Уведомления работают отлично, но они выдаются даже в
случае, если у пользователя уже и без того работает
приложение. Вы можете использовать широковещательные
интенты для настройки поведения
PollWorker
в зависимости
от того, находится ли ваше приложение на переднем плане.
Во-первых, мы будем отправлять широковещательный
интент от вашего
Poll
Worker
при каждом получении новых
фотографий. Затем зарегистрируем два широковещательных
приемника. Первый приемник будет зарегистрирован в вашем
манифесте для Android. Каждый раз, получая трансляцию от
PollWorker
, он будет уведомлять пользователя, как и раньше.
Второй приемник регистрируется динамически и будет активен
только тогда, когда ваше приложение видно пользователю. Его
работа будет заключаться в перехвате трансляций до попадания
в приемник, чтобы уведомление не выводилось.
Использование двух широковещательных приемников
может показаться странным, но в Android нет механизма для
определения того, какие activity или фрагменты выполняются в
настоящее время. Поскольку
PollWorker
не может напрямую
сказать, виден ли в данный момент пользовательский
интерфейс, не получится отфильтровать показ уведомления с
помощью простого оператора условия в
PollWorker
.
Аналогично вы не можете выбрать условную отправку
сообщения, основываясь на том, видно ли приложение
PhotoGallery пользователю, поскольку нет способа определить,
в каком состоянии находится ваше приложение. Однако вы
можете использовать два приемника и настроить их так, чтобы
только один из них реагировал на трансляцию. Так мы и
поступим.
Отправка широковещательных интентов
Самая простая часть решения — отправка ваших собственных
широковещательных интентов. Если говорить конкретнее, вы
разошлете широковещательный интент, который уведомляет
заинтересованные компоненты о том, что оповещение о новых
результатах
поиска
готово.
Чтобы
отправить
широковещательный интент, просто создайте интент и
передайте его
sendBroadcast(Intent)
. В нашем случае
широковещательная
рассылка
будет
применяться
к
определенному нами действию, поэтому также следует
определить константу действия.
Измените код в файле
PollWorker.kt
, как показано ниже.
Do'stlaringiz bilan baham: |