Программирование

Иконка Андроид приложения в статус баре во время выполнения и в фоновом режиме

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

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

Первая трудность была в том, что NotificationCompat.Builder теперь требует создания отдельного канала для уведомлений, а большинство примеров на моем любимом stackoverflow.com либо уже давно устарели, либо тупо не показывают как это сделать (видимо профессионалам и так понятно, а на новичков плевать). Давайте это исправим. Вот полностью рабочий код.

NotificationManager mNotifyMgr;
boolean notif = false;

private void applyStatusBar(String iconTitle, int notificationId) {
        NotificationManager NotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationChannel channel = new NotificationChannel("1001", "Канал озвучки",
                NotificationManager.IMPORTANCE_LOW);
        channel.setDescription("Озвучка голосом всех входящих уведомлений");
        channel.enableLights(true);
        channel.setLightColor(Color.RED);
        channel.enableVibration(false);
        NotificationManager.createNotificationChannel(channel);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "1001")
                .setSmallIcon(R.drawable.ic_stat_headset_mic)
                .setContentTitle(iconTitle);
        Intent resultIntent = new Intent(this, MainActivity.class);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        Notification notification = mBuilder.build();
        notification.flags |= Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT;

        mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        mNotifyMgr.notify(notificationId, notification);
        notif = true;
    }

Как видите, вначале идет создание отдельного канала с id 1001, а затем уже его использование. Не забываем и про обработку нажатия на уведомление, которую мы задаем с помощью Intent (MainActivity.class — это главный класс моего приложения — он и будет открываться). Переменная notif отвечает за проверку существующего уведомления: если оно уже создано, то больше ничего делать не надо.

Использовать функцию можно, например, в onCreate. Id уведомления я от балды назначил равным 1002.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /* тут какой-то ваш код */

        if (!notif)
            applyStatusBar("Я просто озвучиваю уведомления.", 1002);
    }

Соответственно, не забываем и про onDestroy.

@Override
    protected void onDestroy() {
        super.onDestroy();
        if (isFinishing())
            mNotifyMgr.cancel(1002);
    }

Осталось только создать саму иконку, иначе в статус баре у вас будет отображаться некрасивый белый квадрат. Тут я вам очень рекомендую воспользоваться сервисом от Roman Nurik, где можно сделать все буквально в пару кликов мышкой.

Скачиваем архив, распаковываем в \app\src\main\res\, перестраиваем проект и готово! Согласитесь, что теперь ваше приложение смотрится профессиональнее. =)

P. S. Кстати, основную иконку приложения я тоже создавал в этом сервисе.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *