Статьи

Android O: как использовать каналы уведомлений

Конечный продукт
Что вы будете создавать

Google запустил первый предварительный просмотр следующей версии Android для разработчиков под кодовым названием Android O (возможно, Oreo?). Были выпущены некоторые интересные функции, и одна из них — Каналы уведомлений . В этом руководстве мы рассмотрим эту функцию и создадим простое приложение, которое демонстрирует предоставляемые им функциональные возможности.

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

Мы собираемся узнать об этой функции, создав простое приложение под названием «TutsplusAlerts», которое будет предоставлять два канала уведомлений: Android и iOS. Пользователь будет получать уведомление от одного из этих отдельных каналов каждый раз, когда будет представлена ​​новая статья.

Чтобы начать использовать API Android O на момент написания этой статьи, на вашем компьютере должна быть установлена ​​последняя версия Android Studio 2.4 Canary .

Запустите Android Studio 2.4 и откройте Менеджер SDK, нажав Инструменты> Android> Менеджер SDK .

Затем на вкладке Платформы SDK установите флажок Показать сведения о пакете. Ниже предварительного просмотра Android O проверьте следующее: Платформа Android SDK O и API Google Intel x86 Atom System Image (требуется только для эмулятора).

Android Studio SDK Manager

Затем переключитесь на вкладку SDK Tools и выберите следующее:

  • Android SDK Build-Tools 26.0.0 (rc1 или выше)
  • Платформа Android SDK — Инструменты 26.0.0 (rc1 или выше)
  • Эмулятор Android 26.0.0
  • Репозиторий поддержки

Нажмите кнопку ОК , чтобы загрузить все эти компоненты.

В вашей Android Studio создайте новый проект под названием TutsplusAlerts с пустым действием MainActivity .

Android Studio new project setup

Перейдите к сборке модуля приложения . загрузите файл и обновите compileSdkVersion , buildToolsVersion и targetSdkVersion и, наконец, версию библиотеки поддержки.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
android {
    compileSdkVersion «android-O»
    buildToolsVersion «26.0.0-rc1»
 
    defaultConfig {
        applicationId «com.chikeandroid.tutsplusalerts»
        minSdkVersion ‘O’
        targetSdkVersion ‘O’
        versionCode 1
        versionName «1.0»
        testInstrumentationRunner «android.support.test.runner.AndroidJUnitRunner»
  }
  …
}
 
dependencies {
    …
    compile ‘com.android.support:appcompat-v7:26.0.0-alpha1’
    …
}

Не забудьте синхронизировать ваш проект после внесения этих изменений.

Создайте новый класс и назовите его NotificationUtils , расширяя ContextWrapper .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Color;
 
public class NotificationUtils extends ContextWrapper {
 
    private NotificationManager mManager;
    public static final String ANDROID_CHANNEL_ID = «com.chikeandroid.tutsplustalerts.ANDROID»;
    public static final String IOS_CHANNEL_ID = «com.chikeandroid.tutsplustalerts.IOS»;
    public static final String ANDROID_CHANNEL_NAME = «ANDROID CHANNEL»;
    public static final String IOS_CHANNEL_NAME = «IOS CHANNEL»;
 
    public NotificationUtils(Context base) {
        super(base);
        createChannels();
    }
 
    public void createChannels() {
 
        // create android channel
        NotificationChannel androidChannel = new NotificationChannel(ANDROID_CHANNEL_ID,
                ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
        // Sets whether notifications posted to this channel should display notification lights
        androidChannel.enableLights(true);
        // Sets whether notification posted to this channel should vibrate.
        androidChannel.enableVibration(true);
        // Sets the notification light color for notifications posted to this channel
        androidChannel.setLightColor(Color.GREEN);
        // Sets whether notifications posted to this channel appear on the lockscreen or not
        androidChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
 
        getManager().createNotificationChannel(androidChannel);
 
        // create ios channel
        NotificationChannel iosChannel = new NotificationChannel(IOS_CHANNEL_ID,
                IOS_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
        iosChannel.enableLights(true);
        iosChannel.enableVibration(true);
        iosChannel.setLightColor(Color.GRAY);
        iosChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        getManager().createNotificationChannel(iosChannel);
    }
 
    private NotificationManager getManager() {
        if (mManager == null) {
            mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        }
        return mManager;
    }
}

В приведенном выше коде мы создали два экземпляра NotificationChannel , передавая идентификатор (который должен быть уникальным в вашем пакете), имя канала, а также уровень важности в его конструкторе. Для каждого канала уведомлений мы применили такие характеристики, как звук, свет, вибрация и уведомление, чтобы отобразить их на экране блокировки. Наконец, мы получили NotificationManager из системы, а затем зарегистрировали канал, вызвав метод createNotificationChannel() , передав канал, который мы создали.

Мы можем создать несколько каналов уведомлений одновременно с помощью createNotificationChannels() , передавая список Java экземпляров NotificationChannel . Вы можете получить все каналы уведомлений для приложения с помощью getNotificationChannels() и получить определенный канал с помощью getNotificationChannel() , передав в качестве аргумента только идентификатор канала.

Начиная с Android O, уровни приоритета для отдельных уведомлений устарели. Вместо этого вы устанавливаете уровень важности при создании канала уведомлений — от NotificationManager.IMPORTANCE_NONE до NotificationManager.IMPORTANCE_HIGH . Мы установим для Android канал значение IMPORTANCE_DEFAULT , а для канала iOS — IMPORTANCE_HIGH .

Полный список доступных вариантов важности:

  • IMPORTANCE_MAX : не используется
  • IMPORTANCE_HIGH : показывает везде, шумит и заглядывает
  • IMPORTANCE_DEFAULT : показывает везде, шумит, но визуально не мешает
  • IMPORTANCE_LOW : показывает везде, но не навязчиво
  • IMPORTANCE_MIN : показывается только в тени, ниже сгиба
  • IMPORTANCE_NONE : уведомление без значения; не показывает в тени

Все уведомления для канала будут иметь одинаковый уровень важности.

Мы собираемся создать два Уведомления для каждого из наших каналов в классе NotificationUtils мы создали. Мы указываем, какое уведомление следует отправлять на канал, в конструкторе Notification.Builder (Android API 25), где мы передаем ему идентификатор канала в качестве второго аргумента.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
// …
public Notification.Builder getAndroidChannelNotification(String title, String body) {
    return new Notification.Builder(getApplicationContext(), ANDROID_CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(android.R.drawable.stat_notify_more)
            .setAutoCancel(true);
}
 
public Notification.Builder getIosChannelNotification(String title, String body) {
    return new Notification.Builder(getApplicationContext(), IOS_CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(body)
            .setSmallIcon(android.R.drawable.stat_notify_more)
            .setAutoCancel(true);
}
//…

Имейте в виду, что Notification.Builder() также имеет метод setChannel(String channelId) идентификатора канала уведомлений, называемый setChannel(String channelId) , поэтому вы можете установить идентификатор канала уведомлений либо в конструкторе, либо с помощью метода setter.

Теперь, когда у нас есть настройка для создания и публикации в каналах уведомлений, давайте создадим интерфейс XML-макета для публикации сообщения в нашем Activity_main. XML

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?xml version=»1.0″ encoding=»utf-8″?>
<LinearLayout
        xmlns:android=»http://schemas.android.com/apk/res/android»
        xmlns:app=»http://schemas.android.com/apk/res-auto»
        xmlns:tools=»http://schemas.android.com/tools»
        android:id=»@+id/activity_main»
        android:layout_width=»match_parent»
        android:layout_height=»match_parent»
        android:orientation=»vertical»
        android:layout_margin=»16dp»
        tools:context=»com.chikeandroid.tutsplusalerts.MainActivity»>
 
    <LinearLayout
            android:layout_width=»match_parent»
            android:layout_height=»wrap_content»
            android:orientation=»vertical»>
 
        <TextView
                android:layout_width=»wrap_content»
                android:layout_height=»wrap_content»
                android:text=»Tuts+ Android Channel»
                android:layout_gravity=»center_horizontal»
                android:textAppearance=»@style/TextAppearance.AppCompat.Title»/>
 
        <EditText
                android:id=»@+id/et_android_title»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:hint=»Title»/>
 
        <EditText
                android:id=»@+id/et_android_author»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:hint=»Author»/>
         
        <Button
                android:id=»@+id/btn_send_android»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:text=»Send»/>
    </LinearLayout>
 
    <LinearLayout
            android:layout_width=»match_parent»
            android:layout_height=»wrap_content»
            android:orientation=»vertical»
            android:layout_marginTop=»20dp»>
 
        <TextView
                android:layout_width=»wrap_content»
                android:layout_height=»wrap_content»
                android:text=»Tuts+ IOS Channel»
                android:layout_gravity=»center_horizontal»
                android:textAppearance=»@style/TextAppearance.AppCompat.Title»/>
 
        <EditText
                android:id=»@+id/et_ios_title»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:hint=»Title»
                />
 
        <EditText
                android:id=»@+id/et_ios_author»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:hint=»Author»/>
        <Button
                android:id=»@+id/btn_send_ios»
                android:layout_width=»match_parent»
                android:layout_height=»wrap_content»
                android:text=»Send»/>
    </LinearLayout>
     
</LinearLayout>

В этом разделе мы собираемся отредактировать нашу MainActivity чтобы мы могли получить заголовок и автора из компонентов EditText а затем отправить их на канал Android. Мы получаем Notification.Builder для канала Android, который мы создали в наших NotificationUtils , а затем уведомляем NotificationManager .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import android.app.Notification;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class MainActivity extends AppCompatActivity {
 
    private NotificationUtils mNotificationUtils;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mNotificationUtils = new NotificationUtils(this);
 
        final EditText editTextTitleAndroid = (EditText) findViewById(R.id.et_android_title);
        final EditText editTextAuthorAndroid = (EditText) findViewById(R.id.et_android_author);
        Button buttonAndroid = (Button) findViewById(R.id.btn_send_android);
 
        buttonAndroid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String title = editTextTitleAndroid.getText().toString();
                String author = editTextAuthorAndroid.getText().toString();
 
                if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(author)) {
                    Notification.Builder nb = mNotificationUtils.
                            getAndroidChannelNotification(title, «By » + author);
 
                    mNotificationUtils.getManager().notify(101, nb.build());
                }
            }
        });
    }
}

На этом этапе запустите приложение и введите название и автора, а затем нажмите кнопку «Отправить», чтобы немедленно получить уведомление.

Android app emulator send notification shows in notification drawer

Здесь мы разместим на канале iOS. Мы получаем Notification.Builder для канала iOS, который мы создали в нашем NotificationUtils а затем вызываем метод notify() в NotificationManager .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
protected void onCreate(Bundle savedInstanceState) {
    
    // …
     
    final EditText editTextTitleIos = (EditText) findViewById(R.id.et_ios_title);
    final EditText editTextAuthorIos = (EditText) findViewById(R.id.et_ios_author);
    Button buttonIos = (Button) findViewById(R.id.btn_send_ios);
    buttonIos.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String title = editTextTitleIos.getText().toString();
            String author = editTextAuthorIos.getText().toString();
 
            if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(author)) {
                Notification.Builder nb = mNotificationUtils
                        .getIosChannelNotification(title, «By » + author);
 
                mNotificationUtils.getManager().notify(102, nb.build());
            }
        }
    });
}

Запустите приложение еще раз, введите название и автора, а затем нажмите кнопку «Отправить», чтобы немедленно получить уведомление.

Android app emulator send button click shows notification in drawer

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

  • Длительное нажатие на уведомление на панели уведомлений (левое изображение ниже).
  • Настройки > Приложения и уведомления > Уведомления > затем выберите приложение (правое изображение ниже).
Android Emulator app notification settings

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

Включите еще одну кнопку, которая отправит пользователя в настройки уведомлений канала.

1
2
3
4
5
6
7
<!—…—>
<Button
    android:id=»@+id/btn_android_notif_settings»
    android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:text=»Notification Settings»/>
<!—…—>

Здесь мы создаем намерение и передаем ему действие Настройки — ACTION_CHANNEL_NOTIFICATION_SETTINGS (API 25) — и затем добавляем некоторые дополнительные значения: имя пакета приложения и идентификатор канала. Наконец, мы начинаем действие настройки с намерением.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
// …
@Override
protected void onCreate(Bundle savedInstanceState) {
    //…
    Button buttonAndroidNotifSettings = (Button) findViewById(R.id.btn_android_notif_settings);
    buttonAndroidNotifSettings.setOnClickListener(new View.OnClickListener() {
     
        @Override
        public void onClick(View view) {
            Intent i = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
            i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
            i.putExtra(Settings.EXTRA_CHANNEL_ID, NotificationUtils.ANDROID_CHANNEL_ID);
            startActivity(i);
        }
    });
}
//…

Запустите приложение и щелкните настройки уведомлений для канала Android.

Android emulator click android channel notification settings opens device channel settings

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

Если вы хотите перенаправить пользователей к общим настройкам уведомлений для вашего приложения, вы также можете сделать это с помощью Intent :

1
2
3
Intent i = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(i);

Мы также можем сгруппировать каналы уведомлений в группы, чтобы ими можно было управлять вместе. Это полезно для приложений, которые поддерживают несколько учетных записей пользователей. Те же каналы уведомлений доступны для отдельных учетных записей. Например, приложение для социальных сетей может включать поддержку учетных записей как личных, так и деловых пользователей. Код ниже показывает, как создать группу каналов уведомлений:

1
2
3
4
5
String groupId = «group_id_101»;
CharSequence groupName = «Channel Name»;
NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

Мы использовали метод createNotificationChannelGroup() , передав ему экземпляр NotificationChannelGroup , для создания которого требуется идентификатор группы и имя группы.

Как только это будет сделано, нам нужно подключить канал уведомлений к группе с помощью метода NotificationChannel.setGroup() и передать ему идентификатор группы. Если вы хотите создать несколько групп уведомлений одновременно, используйте createNotificationChannelGroups() , передав ему список Java экземпляров NotificationChannelGroup .

Удалить канал уведомления легко, если он больше не нужен. Просто используйте метод менеджера уведомлений deleteNotificationChannel() и передайте идентификатор канала.

1
2
3
NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.deleteNotificationChannel(IOS_CHANNEL_ID);

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

В этом руководстве вы узнали о каналах уведомлений для Android O: что они из себя представляют и как их создать, а также о том, как публиковать уведомления в канале, как получить доступ к настройкам уведомлений канала, как группировать каналы уведомлений и как удалить канал уведомлений.

Чтобы узнать больше о каналах уведомлений, обратитесь к официальной документации . А пока, ознакомьтесь с некоторыми другими нашими курсами и учебными пособиями по разработке приложений для Android!

  • Android SDK
    Совет: создайте авторазмер текста с помощью Android O
    Джессика Торнсби
  • Android SDK
    Кодирование Android-галереи изображений с помощью Glide
  • Android SDK
    Как звонить и использовать SMS в приложениях для Android
  • Android SDK
    Начните с RxJava 2 для Android
    Джессика Торнсби