Android
Kanał powiadomień Android O
Szukaj…
Wprowadzenie
Kanały powiadomień pozwalają nam twórcom aplikacji grupować nasze powiadomienia w grupy — kanały — z możliwością modyfikowania ustawień powiadomień dla całego kanału jednocześnie. W Androidzie O ta funkcja została wprowadzona. Obecnie dostępna jest wersja zapoznawcza dla programistów.
Składnia
- klasa NotificationUtils {} // Do utworzenia kanału powiadomień
- createChannel () // Ogólna metoda tworzenia powiadomień
Parametry
metoda | Opis |
---|---|
IMPORTANCE_MAX | nie używany |
WAŻNOŚĆ: WYSOKA | pokazuje wszędzie, robi hałas i zagląda |
IMPORTANCE_DEFAULT | pokazuje wszędzie, hałasuje, ale nie przeszkadza wizualnie |
IMPORTANCE_LOW | pokazuje wszędzie, ale nie jest nachalny |
IMPORTANCE_MIN | pokazuje się tylko w cieniu, poniżej zakładki |
IMPORTANCE_NONE | powiadomienie bez znaczenia; nie pokazuje się w cieniu |
Kanał powiadomień
Jakie są kanały powiadomień?
Kanały powiadomień pozwalają nam twórcom aplikacji grupować nasze powiadomienia w grupy — kanały — z możliwością modyfikowania ustawień powiadomień dla całego kanału jednocześnie. Na przykład dla każdego kanału użytkownicy mogą całkowicie zablokować wszystkie powiadomienia, przesłonić poziom ważności lub zezwolić na wyświetlanie plakietki powiadomień. Ta nowa funkcja pomaga znacznie poprawić wrażenia użytkownika z aplikacji.
Utwórz kanały powiadomień
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;
}}
W powyższym kodzie stworzyliśmy dwie instancje NotificationChannel, przekazując unikalneid nazwę kanału, a także poziom ważności w jego konstruktorze. Dla każdego kanału powiadomień zastosowaliśmy następujące cechy.
- Dźwięk
- Światła
- Wibracja
- Powiadomienie do wyświetlenia na ekranie blokady.
Wreszcie otrzymaliśmy NotificationManager z systemu, a następnie zarejestrowaliśmy kanał, wywołując metodę createNotificationChannel (), przekazując utworzony przez nas kanał.
Możemy utworzyć wiele kanałów powiadomień jednocześnie za pomocą createNotificationChannels (), przekazując listę Java instancji NotificationChannel. Możesz uzyskać wszystkie kanały powiadomień dla aplikacji za pomocą getNotificationChannels () i uzyskać określony kanał za pomocą getNotificationChannel (), przekazując tylko identyfikator kanału jako argument.
Poziom ważności w kanałach powiadomień
metoda | Opis |
---|---|
IMPORTANCE_MAX | nie używany |
WAŻNOŚĆ: WYSOKA | pokazuje wszędzie, robi hałas i zagląda |
IMPORTANCE_DEFAULT | pokazuje wszędzie, hałasuje, ale nie przeszkadza wizualnie |
IMPORTANCE_LOW | pokazuje wszędzie, ale nie jest nachalny, wartość wynosi 0 |
IMPORTANCE_MIN | pokazuje się tylko w cieniu, poniżej zakładki |
IMPORTANCE_NONE | powiadomienie bez znaczenia; nie pokazuje się w cieniu |
Utwórz powiadomienie i opublikuj na kanale
Utworzyliśmy dwa powiadomienia, jedno za pomocą NotificationUtils, drugie za pomocą 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);
}
Możemy również ustawić NotificationChannel za pomocą Notification.Builder (). W tym celu możemy użyć setChannel (String channelId) .
Zaktualizuj ustawienia kanału powiadomień
Po utworzeniu kanału powiadomień użytkownik odpowiada za jego ustawienia i zachowanie. Możesz ponownie wywołać metodę createNotificationChannel (), aby zmienić nazwę istniejącego kanału powiadomień lub zaktualizować jego opis. Poniższy przykładowy kod opisuje, w jaki sposób można przekierować użytkownika do ustawień kanału powiadomień, tworząc zamiar rozpoczęcia działania. W takim przypadku zamiar wymaga rozszerzonych danych, w tym identyfikatora kanału powiadomień i nazwy pakietu aplikacji.
@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);
}
});
}
Plik XML:
<!--...-->
<Button
android:id="@+id/btn_android_notif_settings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Notification Settings"/>
<!--...-->
Usuwanie kanału powiadomień
Możesz usunąć kanały powiadomień, wywołując metodę 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);
Teraz utwórz MainActivity i 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
zamierzamy edytować naszą MainActivity, abyśmy mogli uzyskać tytuł i autora ze składników EditText, a następnie wysłać je na kanał Androida. Otrzymujemy Notification.Builder dla kanału Android, który utworzyliśmy w naszych NotificationUtils, a następnie powiadamiamy NotificationManager.
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(107, nb.build());
}
}
});
}
}