Google запустил первый предварительный просмотр следующей версии Android для разработчиков под кодовым названием Android O (возможно, Oreo?). Были выпущены некоторые интересные функции, и одна из них — Каналы уведомлений . В этом руководстве мы рассмотрим эту функцию и создадим простое приложение, которое демонстрирует предоставляемые им функциональные возможности.
Что такое каналы уведомлений?
Каналы уведомлений позволяют нам, разработчикам приложений, группировать наши уведомления по группам — каналам, при этом пользователь может изменять настройки уведомлений сразу для всего канала. Например, для каждого канала пользователи могут полностью заблокировать все уведомления, переопределить уровень важности или разрешить отображение значка уведомления. Эта новая функция помогает значительно улучшить взаимодействие с пользователем приложения.
Мы собираемся узнать об этой функции, создав простое приложение под названием «TutsplusAlerts», которое будет предоставлять два канала уведомлений: Android и iOS. Пользователь будет получать уведомление от одного из этих отдельных каналов каждый раз, когда будет представлена новая статья.
1. Установите Android O SDK
Чтобы начать использовать 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 (требуется только для эмулятора).
Затем переключитесь на вкладку SDK Tools и выберите следующее:
- Android SDK Build-Tools 26.0.0 (rc1 или выше)
- Платформа Android SDK — Инструменты 26.0.0 (rc1 или выше)
- Эмулятор Android 26.0.0
- Репозиторий поддержки
Нажмите кнопку ОК , чтобы загрузить все эти компоненты.
2. Создайте проект Android Studio
В вашей Android Studio создайте новый проект под названием TutsplusAlerts с пустым действием MainActivity
.
3. Обновите build.gradle
Перейдите к сборке модуля приложения . загрузите файл и обновите 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’
…
}
|
Не забудьте синхронизировать ваш проект после внесения этих изменений.
4. Создайте каналы уведомлений
Создайте новый класс и назовите его 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
: уведомление без значения; не показывает в тени
Все уведомления для канала будут иметь одинаковый уровень важности.
5. Создание уведомлений и публикация на каналах
Мы собираемся создать два Уведомления для каждого из наших каналов в классе 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.
6. Создайте макет XML
Теперь, когда у нас есть настройка для создания и публикации в каналах уведомлений, давайте создадим интерфейс 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>
|
7. Публиковать уведомления на каналах
Отправка на канал Android
В этом разделе мы собираемся отредактировать нашу 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());
}
}
});
}
}
|
На этом этапе запустите приложение и введите название и автора, а затем нажмите кнопку «Отправить», чтобы немедленно получить уведомление.
Отправка на канал iOS
Здесь мы разместим на канале 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());
}
}
});
}
|
Запустите приложение еще раз, введите название и автора, а затем нажмите кнопку «Отправить», чтобы немедленно получить уведомление.
8. Настройки канала уведомлений
На момент написания этой статьи вы не можете программно изменить конфигурацию определенных параметров канала уведомлений. Вместо этого, единственный доступный вариант — это перейти на экран настроек уведомлений для приложения в настройках устройства. Оттуда пользователь может получить доступ к настройкам уведомлений приложения, чтобы изменить такие настройки, как вибрация, звук и т. Д. Пользователи могут перейти к настройкам уведомлений приложения одним из следующих способов:
- Длительное нажатие на уведомление на панели уведомлений (левое изображение ниже).
- Настройки > Приложения и уведомления > Уведомления > затем выберите приложение (правое изображение ниже).
Вы также можете отправить пользователя прямо из вашего приложения в настройки уведомлений канала. Давайте посмотрим, как мы можем сделать это для канала Android. Рекомендуется сделать это в настройках приложения, чтобы пользователям было проще получить доступ к этим параметрам уведомлений.
Изменить макет XML
Включите еще одну кнопку, которая отправит пользователя в настройки уведомлений канала.
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.
В настройках уведомлений канала пользователи могут редактировать настройки, такие как включение вибрации, изменение важности или отображение значка (если поддерживается) для канала.
Если вы хотите перенаправить пользователей к общим настройкам уведомлений для вашего приложения, вы также можете сделать это с помощью Intent
:
1
2
3
|
Intent i = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(i);
|
9. Создать группы уведомлений
Мы также можем сгруппировать каналы уведомлений в группы, чтобы ими можно было управлять вместе. Это полезно для приложений, которые поддерживают несколько учетных записей пользователей. Те же каналы уведомлений доступны для отдельных учетных записей. Например, приложение для социальных сетей может включать поддержку учетных записей как личных, так и деловых пользователей. Код ниже показывает, как создать группу каналов уведомлений:
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
.
10. Удалить канал уведомлений
Удалить канал уведомления легко, если он больше не нужен. Просто используйте метод менеджера уведомлений deleteNotificationChannel()
и передайте идентификатор канала.
1
2
3
|
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.deleteNotificationChannel(IOS_CHANNEL_ID);
|
Однако имейте в виду, что удаленные каналы остаются видимыми в настройках уведомлений, чтобы предотвратить спам.
Вывод
В этом руководстве вы узнали о каналах уведомлений для Android O: что они из себя представляют и как их создать, а также о том, как публиковать уведомления в канале, как получить доступ к настройкам уведомлений канала, как группировать каналы уведомлений и как удалить канал уведомлений.
Чтобы узнать больше о каналах уведомлений, обратитесь к официальной документации . А пока, ознакомьтесь с некоторыми другими нашими курсами и учебными пособиями по разработке приложений для Android!