Android status bar action bar

Android Notifications. Оповещения через Status Bar

Добрый день, хабровчане. Давно занимаюсь разработкой под Android и хотелось бы рассказать сообществу о правильном подходе к созданию уведомлений.

На хабре уже есть статья по уведомлениям в статус баре для андроид . В ней рассматриваются основы отображения стандартного и конфигурируемого layout в статус баре.

Ниже, помимо описанного ранее, мы рассмотрим добавление прогрессбара, обработку события по нажатию на уведомлений, различные варианты состояний уведомлений. Рассмотрим добавленный на днях в Compatibility library Notification.Builder. А также поговорим о рекомендациям по UI (design guidlines), которые гугл рекомендует соблюдать при создании уведомлений.

Guidlines
Как советуют разработчики Android в официальном гайдлайне

Когда показывать уведомления:
  • Мы показываем уведомления, когда не хотим отвлекать пользователя, перекрывая ему экран нашими диалогами или переходом на экран уведомления. Мы не отвлекаем пользователя, но при этом не лишаем его возможности узнать содержание нашего уведомления в любой момент.
  • Чаще всего уведомления не всплывают спонтанно, а появляются в моменты, когда пользователь ожидает реакции от приложения.
  • В первую очередь уведомления должны отражать события, зависящие от времени. Как то: события календаря, входящие сообщения, запросы из социальных сетей.
Когда не стоит показывать уведомления:
  1. Не нужно показывать уведомления для не важных псевдо-зависящих от времени событий. Например, новости из социальных сетей.
  2. Нет необходимости показывать то, что уже отображено в UI приложения.
  3. Не стоит отображать ход низкоуровневых операций, вроде обращения к БД.
  4. Если приложение быстро само исправляет ошибку, то не нужно вовсе показывать эту ошибку, тем более уведомлением.
  5. Не показывайте уведомления о сервисах, которые пользователь не может контролировать.
  6. Плохим подходом является создание большого числа уведомлений, с целью напоминать пользователю о приложении, показывая постоянно его иконку и имя.
Хорошая практика:

  1. По клику на уведомление, пользователю должен открываться соответствующий экран приложения. В некоторых случаях достаточно, чтобы по клику уведомление просто убиралось.
  2. Указание времени события в уведомлении, также является хорошим подходом.
  3. Рекомендуется схожие события складывать в одно уведомление, а не отображать на каждое событие своё.
  4. Всегда убирать из статус-бара уведомления, с которыми пользователь уже ознакомился и произвел соответствующие действия.
  5. Показывать маленькое превью уведомления при его создании в свёрнутом статус-баре
  6. Позволять пользователю отключать уведомления в настройках приложения.
  7. Использовать иконки, обозначающие принадлежность уведомления определённому приложению. Иконки делать монохромными. Для этого рекомндуется воспользоваться специальным онлайн-редактором
  8. В случае, если событие требует непосредственной реакции пользователя — вместо уведомлений использовать диалоги.
Архитектура:

В качестве утилитки, отвечающей за уведомления, я в своих приложениях использую singleton, к которому можно обратиться из любого класса приложения, нужно лишь иметь ссылку на context.

В ней всегда хранятся ссылки на все созданные во время работы приложения уведомления, которые ещё отображены в статус-баре.

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

private static final String TAG = NotificationUtils. class .getSimpleName();

private static NotificationUtils instance;

private static Context context;
private NotificationManager manager; // Системная утилита, упарляющая уведомлениями
private int lastId = 0; //постоянно увеличивающееся поле, уникальный номер каждого уведомления
private HashMap notifications; //массив ключ-значение на все отображаемые пользователю уведомления

Читайте также:  Kali linux backdoor android

//приватный контструктор для Singleton
private NotificationUtils(Context context) <
this .context = context;
manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notifications = new HashMap ();
>
/**
* Получение ссылки на синглтон
*/
public static NotificationUtils getInstance(Context context) <
if(instance== null ) <
instance = new NotificationUtils(context);
> else <
instance.context = context;
>
return instance;
>

* This source code was highlighted with Source Code Highlighter .

Создание уведомления с помощью NotificationCompat.Builder:
Для того чтобы воспользоваться классами, входящими в библиотеку поддержки прошлых версий (Compatibility library), нужно добавить в проект библиотеку из папки /extras/android/support/v4/android-support-v4.jar
Если же проект нацелен на Android 3.0 и выше, то добавлять ничего не нужно достаточно обратиться к Notification.Builder

public int createInfoNotification( String message) <
Intent notificationIntent = new Intent(context, HomeActivity. class ); // по клику на уведомлении откроется HomeActivity
NotificationCompat.Builder nb = new NotificationCompat.Builder(context)
//NotificationCompat.Builder nb = new NotificationBuilder(context) //для версии Android > 3.0
.setSmallIcon(R.drawable.ic_action_picture) //иконка уведомления
.setAutoCancel( true ) //уведомление закроется по клику на него
.setTicker(message) //текст, который отобразится вверху статус-бара при создании уведомления
.setContentText(message) // Основной текст уведомления
.setContentIntent(PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT))
.setWhen(System.currentTimeMillis()) //отображаемое время уведомления
.setContentTitle( «AppName» ) //заголовок уведомления
.setDefaults(Notification.DEFAULT_ALL); // звук, вибро и диодный индикатор выставляются по умолчанию

Notification notification = nb.getNotification(); //генерируем уведомление
manager.notify(lastId, notification); // отображаем его пользователю.
notifications.put(lastId, notification); //теперь мы можем обращаться к нему по id
return lastId++;
>

* This source code was highlighted with Source Code Highlighter .

Создание уведомления с произвольным отображением (Custom layout):

/**
* Создание уведомления с прогрессбаром о загрузке
* @param fileName — текст, отображённый в заголовке уведомления.
*/
public int createDownloadNotification( String fileName) <
String text = context.getString(R. string .notification_downloading).concat( » » ).concat(fileName); //текст уведомления
RemoteViews contentView = createProgressNotification(text, context.getString(R. string .notification_downloading)); //View уведомления
contentView.setImageViewResource(R.id.notification_download_layout_image, R.drawable.ic_stat_example); // иконка уведомления
return lastId++; //увеличиваем id, которое будет соответствовать следующему уведомлению
>

/**
* генерация уведомления с ProgressBar, иконкой и заголовком
*
* @param text заголовок уведомления
* @param topMessage сообщение, уотображаемое в закрытом статус-баре при появлении уведомления
* @return View уведомления.
*/
private RemoteViews createProgressNotification( String text, String topMessage) <
Notification notification = new Notification(R.drawable.ic_stat_example, topMessage, System.currentTimeMillis());
RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_download_layout);
contentView.setProgressBar(R.id.notification_download_layout_progressbar, 100, 0, false );
contentView.setTextViewText(R.id.notification_download_layout_title, text);

notification.contentView = contentView;
notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT | Notification.FLAG_ONLY_ALERT_ONCE;

Intent notificationIntent = new Intent(context, NotificationUtils. class );
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;

manager.notify(lastId, notification);
notifications.put(lastId, notification);
return contentView;
>

xml version =»1.0″ encoding =»utf-8″ ? >
LinearLayout xmlns:android =»http://schemas.android.com/apk/res/android»
android:layout_width =»fill_parent»
android:layout_height =»65sp»
android:padding =»10dp»
android:orientation =»vertical» >

LinearLayout
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»
android:orientation =»horizontal» >

ImageView
android:id =»@+id/notification_download_layout_image»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:src =»@drawable/ic_stat_example»
android:layout_gravity =»center_vertical»/>

TextView
android:id =»@+id/notification_download_layout_title»
style =»@style/NotificationTitle»
android:layout_width =»wrap_content»
android:layout_height =»wrap_content»
android:layout_alignParentTop =»true»
android:layout_marginLeft =»10dip»
android:singleLine =»true»
android:text =»notification_download_layout_title»
android:layout_gravity =»center_vertical»/>
LinearLayout >

ProgressBar
android:id =»@+id/notification_download_layout_progressbar»
style =»?android:attr/progressBarStyleHorizontal»
android:layout_width =»fill_parent»
android:layout_height =»wrap_content»
android:layout_marginTop =»4dp»
android:progress =»0″/>

в андроид 2.3 и выше ( API >10) был создан специальный ресурс, в котором системная тема указывает цвета текста уведомений. Из-за этого в старых версиях приходится использовать костыль:

В файл res/values/styles.xml прописываем:

xml version =»1.0″ encoding =»utf-8″ ? >
resources >
style name =»NotificationText» >
item name =»android:textColor» > ?android:attr/textColorPrimary item >
style >
style name =»NotificationTitle» >
item name =»android:textColor» > ?android:attr/textColorPrimary item >
item name =»android:textStyle» > bold item >
style >

А для поддержки API >10 Создаем файл res/values-v9/styles.xml и вписываем:

xml version =»1.0″ encoding =»utf-8″ ? >
resources >
style name =»NotificationText» parent =»android:TextAppearance.StatusBar.EventContent»/>
style name =»NotificationTitle» parent =»android:TextAppearance.StatusBar.EventContent.Title»/>
resources >

Теперь из кода нашего приложения обращаемся к утилите:

NotificationUtils n = NotificationUtils.getInstance(getActivity());
n.createInfoNotification( «info notification» );

Создаем уведомление с прогресс-баром:

int pbId = NotificationUtils.getInstance(getActivity()).createDownloadNotification( «downloading video» );

И во время выполнения потока постоянно обновляем прогресс вызовом:

Читайте также:  Как убрать второй экран андроид

В итоге получаем:

Как видно — нижнее уведомление, созданное нами при помощи билдера может быть удалено в любой момент. А уведомление с прогресс-баром размещается в верхнем блоке уведомлений, в котором пользователь не может очистить уведомления.

И напоследок маленькая хитрость:

Если не хотите дублирования в стеке одних и тех же Activity — поставьте в манифесте к нужной activity
android:launchMode=»singleTop»

Источник

Android status bar action bar

Указанная тема не существует, или находится на премодерации.

Cookies Preference Center

We use cookies on this website. To learn in detail about how we use cookies, please read our full Cookies Notice. To reject all non-essential cookies simply click «Save and Close» below. To accept or reject cookies by category please simply click on the tabs to the left. You can revisit and change your settings at any time. read more

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services such as setting your privacy preferences, logging in or filling in formsYou can set your browser to block or alert you about these cookies, but some parts of thesite will not then work. These cookies do not store any personally identifiable information.

Источник

Как я сделал статус-бар на Android по кайфу

Для меня кастомизация Android всегда была чем-то далёким и откровенно гиковским. Ну зачем, думал я, что-то менять, если разработчики – явно неглупые люди – всё уже продумали за меня? Долгое время меня вполне устраивала моя позиция, и желания что-либо менять в интерфейсе своего смартфона у меня не было, тем более что обычно для этого приходилось что-то перепрошивать или устанавливать сторонние моды. Однако я немного изменил своё отношение к такому явлению, как кастомизация, когда познакомился с приложением Super Status Bar.

Не устраивает статус-бар на Android? Кастомизируйте его

Это приложение, как ясно из названия, позволяет настроить статус-бар Android-смартфона так, как хочется именно вам. На самом деле сначала меня привлекла только функция блокировки смартфона по двойному нажатию на верхнюю часть экрана, однако довольно быстро стало понятно, что эта программа может сильно улучшить такой незначительный, на первый взгляд, компонент операционной системы, как статус-бар.

Читайте также:  Как отключить режим разработчика андроид huawei

Разрешения на Android

Приложение запросит две привилегии — дайте их

Для начала вам потребуется дать Super Status Bar две привилегии: возможность изменять настройки и открыть доступ к службе специальных возможностей. Это необходимо для того, чтобы приложение смогло вносить изменения в статус-бар и расширить его функциональность.

После того, как разрешения будут даны, вернитесь на домашний экран. Здесь вы увидите 7 вкладок, в которых скрываются настройки статус-бара. Забегая вперёд, скажу, что не советую включать сразу все параметры, во-первых, чтобы не запутаться, а, во-вторых, чтобы не перегрузить его.

Как можно заблокировать Android-смартфон

Первое, что я сделал, это включил возможность блокировать смартфон по двойному тапу на статус-бар. Для этого откройте вкладку «Жесты» — «Двойное нажатие» и активируйте параметр «Выключить экран». После этого вы сможете быстро и непринуждённо гасить экран, не задействуя физическую клавишу питания. Это очень удобно в ситуациях, когда смартфон лежит на столе, а возможности взять его в руки по какой-то причине у вас нет, либо если боковая клавиша включения и выключения сломалась.

Управлять статус-баром при помощи жестов реально удобно

Затем я настроил изменение яркости дисплея жестом скольжения вправо или влево по статус-бару. Как оказалось, это очень классная возможность, которой мне очень давно не хватало, ведь в помещении мне всегда было много максимальной яркости моего Honor View 20, и мало – на улице. Для активации этого механизма перейдите во вкладку «Жесты» и включите параметр «Скольжение». Здесь же можно настроить вызов конкретных приложений с помощью жестов, но, на мой взгляд, это было бы уже чересчур.

Как изменить статус-бар на Android

На Android можно заменить привычный статус-бар на решение из iOS

Скажу честно, мне никогда не нравились иконки в статус-баре на Android и всегда нравилась реализация iOS. Поэтому для меня стал позитивным открытие тот факт, что Super Status Bar позволяет заменить классический статус-бар Android решением, используемым в iOS. Для этого перейдите во вкладку «Статус-бар» — «Стиль» и выберите понравившийся. Кроме iOS, тут есть статус-бары из Android 10, Android 9 Pie и MIUI. Правда, учитывайте, что такая рокировка доступна только в платной версии приложения, за которую придётся заплатить 189 рублей.

Как на Android переключать песни длительным нажатием на кнопки регулировки громкости

Если вам не нравится, как реализованы уведомления на Android, Super Status Bar и тут придёт вам на помощь. Он позволяет заблокировать появление всплывающих окон с оповещениями, заменив их бегущей строкой с содержимым послания. Для этого откройте вкладку «Текст в строке» и включите параметр «Бегущий текст в статус-баре». Тут же можно настроить скорость анимации бегущего текста, начальную задержку перед его появлением, изменить фон, на котором он будет появляться и настроить стилистику появления текста.

Уведомления бегущей строкой воспринимаются реально удобнее

Super Status Bar – их тех приложений, которые запускаются один раз. А ведь и правда, если можно сразу настроить все конфигурации статус-бара, то зачем открывать его повторно и вносить какие-то изменения? По крайней мере, я так решил для себя, включив все нужные мне параметры. Попробуйте и вы. Думаю, вам понравится.

Источник

Оцените статью