Поиск…


Вступление

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

Синтаксис

  1. class NotificationUtils {} // Для создания канала уведомлений
  2. createChannel () // Общий метод для создания уведомления

параметры

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

Канал уведомлений

Что такое каналы уведомлений?

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

Создание каналов уведомлений

 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.sai.ANDROID";
public static final String IOS_CHANNEL_ID = "com.sai.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.BLUE);
    // 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, передав uniqueid имя канала, а также уровень важности в его конструкторе. Для каждого канала уведомлений мы применяли следующие характеристики.

  1. звук
  2. огни
  3. вибрация
  4. Уведомление на экране блокировки.

Наконец, мы получили NotificationManager из системы, а затем зарегистрировали канал, вызвав метод createNotificationChannel (), передав канал, который мы создали.

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

Уровень важности в каналах уведомлений

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

Создать уведомление и отправить на канал

Мы создали два уведомления, используя NotificationUtils другой, используя NotificationBuilder.

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);
}

Мы также можем установить NotificationChannel, используя Notification.Builder (). Для этого мы можем использовать setChannel (String channelId) .

Обновление настроек канала уведомлений

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

@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);
        }
    });
}

XML-файл:

<!--...-->
<Button
    android:id="@+id/btn_android_notif_settings"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Notification Settings"/>
<!--...-->

Удаление канала уведомлений

Вы можете удалить каналы уведомлений, вызвав deleteNotificationChannel ().

NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// The id of the channel.
String id = "my_channel_01";
NotificationChannel mChannel = mNotificationManager.getNotificationChannel(id);
mNotificationManager.deleteNotificationChannel(mChannel);

Теперь создайте MainActivity и xml

activity_main.xml

<?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.java

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

import android.app.Notification; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; импортировать 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(107, nb.build());
                }
            }
        });
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow