Android O: Cómo Usar Canales de Notificación
Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)



Google ha lanzado la primera vista previa de desarrollador de la siguiente versión de Android, actualmente con nombre código Android O (¿Oreo tal vez?). Algunas características emocionantes fueron liberadas, y una de ella es Canales de Notificación. En este tutorial, exploraremos esta característica y construiremos una aplicación simple que demuestre las funcionalidades que estos proporcionan.
¿Qué Son Canales de Notificación?
Los canales de notificación nos permiten a los desarrolladores de aplicaciones agrupar nuestras notificaciones en grupos---canales---con el usuario teniendo la habilidad de modificar los ajustes de notificación para el canal entero a la vez. Por ejemplo, para cada canal, los usuarios pueden bloquear completamente todas las notificaciones, anular el nivel de importancia, o permitir que la insignia de la notificación se muestre. Esta nueva característica ayuda a mejorar enormemente la experiencia de usuario de una aplicación.
Vamos a aprender sobre esta característica construyendo una simple aplicación llamada "TutsPlusAlerts" que proporcionará dos canales: Android y iOS. El usuario recibirá una notificación de uno de estos canales separados siempre que un nuevo artículo sea enviado.
1. Configura el SDK de Android O
Para comenzar a usar las APIs de Android O hasta esta escritura, necesitarás tener el más reciente Android Studio 2.4 Canary instalado en tu computadora.
Lanza Android Studio 2.4 y abre el SDK Manager dando clic a Tools > Android > SDK Manager.
Después, en la pestaña SDK Platforms, marca Show Package Details. Debajo de Android O Preview, marca lo siguiente: Android SDK Platform O y Google APIs Intel x86 Atom System Image (requerido solo para el emulador).



Después cambia a la pestaña SDK Tools, y selecciona la siguiente:
- Android SDK Build-Tools 26.0.0 (rc1 o superior)
- Android SDK Platform-Tools 26.0.0 (rc1 o superior)
- Android Emulator 26.0.0
- Support Repository
Da clic al botón OK para descargar todos estos componentes.
2. Crea un Proyecto de Android Studio
En tu Android Studio, crea un nuevo proyecto llamado TutsplusAlerts con una actividad vacía llamada MainActivity.
3. Actualiza build.gradle
Ve a tu archivo build.gradle del módulo app y actualiza compileSdkVersion, buildToolsVersion y targetSdkVersion y finalmente la versión de Librería de Soporte.
1 |
android { |
2 |
compileSdkVersion "android-O" |
3 |
buildToolsVersion "26.0.0-rc1" |
4 |
|
5 |
defaultConfig { |
6 |
applicationId "com.chikeandroid.tutsplusalerts" |
7 |
minSdkVersion 'O' |
8 |
targetSdkVersion 'O' |
9 |
versionCode 1 |
10 |
versionName "1.0" |
11 |
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" |
12 |
}
|
13 |
...
|
14 |
}
|
15 |
|
16 |
dependencies { |
17 |
...
|
18 |
compile 'com.android.support:appcompat-v7:26.0.0-alpha1' |
19 |
...
|
20 |
}
|
Recuerda sincronizar tu proyecto después de hacer estos cambios.
4. Crea Canales de Notificación
Crea una nueva clase y llámala NotificationUtils, extendiendo ContextWrapper.
1 |
import android.app.Notification; |
2 |
import android.app.NotificationChannel; |
3 |
import android.app.NotificationManager; |
4 |
import android.content.Context; |
5 |
import android.content.ContextWrapper; |
6 |
import android.graphics.Color; |
7 |
|
8 |
public class NotificationUtils extends ContextWrapper { |
9 |
|
10 |
private NotificationManager mManager; |
11 |
public static final String ANDROID_CHANNEL_ID = "com.chikeandroid.tutsplustalerts.ANDROID"; |
12 |
public static final String IOS_CHANNEL_ID = "com.chikeandroid.tutsplustalerts.IOS"; |
13 |
public static final String ANDROID_CHANNEL_NAME = "ANDROID CHANNEL"; |
14 |
public static final String IOS_CHANNEL_NAME = "IOS CHANNEL"; |
15 |
|
16 |
public NotificationUtils(Context base) { |
17 |
super(base); |
18 |
createChannels(); |
19 |
}
|
20 |
|
21 |
public void createChannels() { |
22 |
|
23 |
// create android channel
|
24 |
NotificationChannel androidChannel = new NotificationChannel(ANDROID_CHANNEL_ID, |
25 |
ANDROID_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT); |
26 |
// Sets whether notifications posted to this channel should display notification lights
|
27 |
androidChannel.enableLights(true); |
28 |
// Sets whether notification posted to this channel should vibrate.
|
29 |
androidChannel.enableVibration(true); |
30 |
// Sets the notification light color for notifications posted to this channel
|
31 |
androidChannel.setLightColor(Color.GREEN); |
32 |
// Sets whether notifications posted to this channel appear on the lockscreen or not
|
33 |
androidChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); |
34 |
|
35 |
getManager().createNotificationChannel(androidChannel); |
36 |
|
37 |
// create ios channel
|
38 |
NotificationChannel iosChannel = new NotificationChannel(IOS_CHANNEL_ID, |
39 |
IOS_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH); |
40 |
iosChannel.enableLights(true); |
41 |
iosChannel.enableVibration(true); |
42 |
iosChannel.setLightColor(Color.GRAY); |
43 |
iosChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); |
44 |
getManager().createNotificationChannel(iosChannel); |
45 |
}
|
46 |
|
47 |
private NotificationManager getManager() { |
48 |
if (mManager == null) { |
49 |
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); |
50 |
}
|
51 |
return mManager; |
52 |
}
|
53 |
}
|
En el código de arriba, creamos dos instancias de NotificationChannel, pasando un id (que debe ser único dentro de tu paquete), un nombre de cana, y también un nivel de importancia en su constructor. Para cada canal de notificación, aplicamos características tales como sonido, luces, vibración, y una notificación para mostrar en la pantalla de bloqueo. Finalmente, obtuvimos el NotificationManager del sistema y después registramos el canal llamando al método createNotificationChannel(), pasando el canal que hemos creado.
Podemos crear múltiples canales de notificación a la vez con createNotificationChannels(), pasando una lista Java de instancias NotificationChannel. Puedes obtener todos los canales de notificación para una aplicación con getNotificationChannels() y obtener un canal específico con getNotificationChannel(), pasando solo el id de canal como un argumento.
Niveles de Importancia
Comenzando desde Android O, los niveles de prioridad son obsoletos para notificaciones individuales. En su lugar, estableces un nivel de importancia cuando creas un canal de notificación---variando desde NotificationManager.IMPORTANCE_NONE hasta NotificationManager.IMPORTANCE_HIGH. Estableceremos el canal Android para ser IMPORTANCE_DEFAULT, mientras que el canal iOS será IMPORTANCE_HIGH.
La lista completa de opciones de importancia disponibles son:
-
IMPORTANCE_MAX: si nusar -
IMPORTANCE_HIGH: se muestra en todos lados, hace ruido y se asoma
-
IMPORTANCE_DEFAULT: se muestra en todos lados, hace ruido, pero no estorba visualmente
-
IMPORTANCE_LOW: se muestra en todos lados, pero no es intrusiva -
IMPORTANCE_MIN: se muestra solo en la sombra, debajo del doblez -
IMPORTANCE_NONE: una notificación sin importancia; no se muestra en la sombra
A todas las notificaciones para un canal se les dará el mismo nivel de importancia.
5. Crea Notificaciones y Publica en Canales
Vamos a crear dos Notificaciones para cada uno de nuestros canales en la clase NotificationUtils que creamos. Especificamos qué notificación debería ser enviada a un canal en el constructor Notification.Builder (Android API 25), en donde le pasamos el id de canal como el segundo argumento.
1 |
// ...
|
2 |
public Notification.Builder getAndroidChannelNotification(String title, String body) { |
3 |
return new Notification.Builder(getApplicationContext(), ANDROID_CHANNEL_ID) |
4 |
.setContentTitle(title) |
5 |
.setContentText(body) |
6 |
.setSmallIcon(android.R.drawable.stat_notify_more) |
7 |
.setAutoCancel(true); |
8 |
}
|
9 |
|
10 |
public Notification.Builder getIosChannelNotification(String title, String body) { |
11 |
return new Notification.Builder(getApplicationContext(), IOS_CHANNEL_ID) |
12 |
.setContentTitle(title) |
13 |
.setContentText(body) |
14 |
.setSmallIcon(android.R.drawable.stat_notify_more) |
15 |
.setAutoCancel(true); |
16 |
}
|
17 |
//...
|
Ten en cuenta que Notification.Builder() también tiene un método de fijación de id de canal de notificación llamado setChannel(String channelId), así que puedes elegir establecer el id de canal de notificación en el constructor o usando el método fijador.
6. Crea la Retícula XML
Ahora que tenemos la configuración para crear y publicar a los canales de notificación, creemos la interfaz de retícula XML para publicar el mensaje en nuestro activity_main.xml.
1 |
<?xml version="1.0" encoding="utf-8"?>
|
2 |
<LinearLayout
|
3 |
xmlns:android="http://schemas.android.com/apk/res/android" |
4 |
xmlns:app="http://schemas.android.com/apk/res-auto" |
5 |
xmlns:tools="http://schemas.android.com/tools" |
6 |
android:id="@+id/activity_main" |
7 |
android:layout_width="match_parent" |
8 |
android:layout_height="match_parent" |
9 |
android:orientation="vertical" |
10 |
android:layout_margin="16dp" |
11 |
tools:context="com.chikeandroid.tutsplusalerts.MainActivity"> |
12 |
|
13 |
<LinearLayout
|
14 |
android:layout_width="match_parent" |
15 |
android:layout_height="wrap_content" |
16 |
android:orientation="vertical"> |
17 |
|
18 |
<TextView
|
19 |
android:layout_width="wrap_content" |
20 |
android:layout_height="wrap_content" |
21 |
android:text="Tuts+ Android Channel" |
22 |
android:layout_gravity="center_horizontal" |
23 |
android:textAppearance="@style/TextAppearance.AppCompat.Title"/> |
24 |
|
25 |
<EditText
|
26 |
android:id="@+id/et_android_title" |
27 |
android:layout_width="match_parent" |
28 |
android:layout_height="wrap_content" |
29 |
android:hint="Title"/> |
30 |
|
31 |
<EditText
|
32 |
android:id="@+id/et_android_author" |
33 |
android:layout_width="match_parent" |
34 |
android:layout_height="wrap_content" |
35 |
android:hint="Author"/> |
36 |
|
37 |
<Button
|
38 |
android:id="@+id/btn_send_android" |
39 |
android:layout_width="match_parent" |
40 |
android:layout_height="wrap_content" |
41 |
android:text="Send"/> |
42 |
</LinearLayout>
|
43 |
|
44 |
<LinearLayout
|
45 |
android:layout_width="match_parent" |
46 |
android:layout_height="wrap_content" |
47 |
android:orientation="vertical" |
48 |
android:layout_marginTop="20dp"> |
49 |
|
50 |
<TextView
|
51 |
android:layout_width="wrap_content" |
52 |
android:layout_height="wrap_content" |
53 |
android:text="Tuts+ IOS Channel" |
54 |
android:layout_gravity="center_horizontal" |
55 |
android:textAppearance="@style/TextAppearance.AppCompat.Title"/> |
56 |
|
57 |
<EditText
|
58 |
android:id="@+id/et_ios_title" |
59 |
android:layout_width="match_parent" |
60 |
android:layout_height="wrap_content" |
61 |
android:hint="Title" |
62 |
/>
|
63 |
|
64 |
<EditText
|
65 |
android:id="@+id/et_ios_author" |
66 |
android:layout_width="match_parent" |
67 |
android:layout_height="wrap_content" |
68 |
android:hint="Author"/> |
69 |
<Button
|
70 |
android:id="@+id/btn_send_ios" |
71 |
android:layout_width="match_parent" |
72 |
android:layout_height="wrap_content" |
73 |
android:text="Send"/> |
74 |
</LinearLayout>
|
75 |
|
76 |
</LinearLayout>
|
7. Publica Notificaciones a Canales
Publicando al Canal Android
En esta sección, vamos a editar nuestro MainActivity para que podamos obtener el título y autor de los componentes EditText y después enviar estos al canal Android. Obtenemos el Notification.Builder para el canal Android que creamos en nuestro NotificationUtils, y después notificamos al NotificationManager.
1 |
import android.app.Notification; |
2 |
import android.os.Bundle; |
3 |
import android.support.v7.app.AppCompatActivity; |
4 |
import android.text.TextUtils; |
5 |
import android.view.View; |
6 |
import android.widget.Button; |
7 |
import android.widget.EditText; |
8 |
|
9 |
public class MainActivity extends AppCompatActivity { |
10 |
|
11 |
private NotificationUtils mNotificationUtils; |
12 |
|
13 |
@Override
|
14 |
protected void onCreate(Bundle savedInstanceState) { |
15 |
super.onCreate(savedInstanceState); |
16 |
setContentView(R.layout.activity_main); |
17 |
|
18 |
mNotificationUtils = new NotificationUtils(this); |
19 |
|
20 |
final EditText editTextTitleAndroid = (EditText) findViewById(R.id.et_android_title); |
21 |
final EditText editTextAuthorAndroid = (EditText) findViewById(R.id.et_android_author); |
22 |
Button buttonAndroid = (Button) findViewById(R.id.btn_send_android); |
23 |
|
24 |
buttonAndroid.setOnClickListener(new View.OnClickListener() { |
25 |
@Override
|
26 |
public void onClick(View view) { |
27 |
String title = editTextTitleAndroid.getText().toString(); |
28 |
String author = editTextAuthorAndroid.getText().toString(); |
29 |
|
30 |
if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(author)) { |
31 |
Notification.Builder nb = mNotificationUtils. |
32 |
getAndroidChannelNotification(title, "By " + author); |
33 |
|
34 |
mNotificationUtils.getManager().notify(101, nb.build()); |
35 |
}
|
36 |
}
|
37 |
});
|
38 |
}
|
39 |
}
|
En este punto, ejecuta la aplicación e ingresa un título y un autor, y después da clic al botón enviar para recibir la notificación inmediatamente.



Publicando al Canal iOS
Aquí publicaríamos al canal iOS. Obtenemos el Notification.Builder para el canal iOS que creamos en nuestro NotificationUtils y después llamamos al método notify() en el NotificationManager.
1 |
@Override
|
2 |
protected void onCreate(Bundle savedInstanceState) { |
3 |
|
4 |
// ...
|
5 |
|
6 |
final EditText editTextTitleIos = (EditText) findViewById(R.id.et_ios_title); |
7 |
final EditText editTextAuthorIos = (EditText) findViewById(R.id.et_ios_author); |
8 |
Button buttonIos = (Button) findViewById(R.id.btn_send_ios); |
9 |
buttonIos.setOnClickListener(new View.OnClickListener() { |
10 |
@Override
|
11 |
public void onClick(View view) { |
12 |
String title = editTextTitleIos.getText().toString(); |
13 |
String author = editTextAuthorIos.getText().toString(); |
14 |
|
15 |
if(!TextUtils.isEmpty(title) && !TextUtils.isEmpty(author)) { |
16 |
Notification.Builder nb = mNotificationUtils |
17 |
.getIosChannelNotification(title, "By " + author); |
18 |
|
19 |
mNotificationUtils.getManager().notify(102, nb.build()); |
20 |
}
|
21 |
}
|
22 |
});
|
23 |
}
|
Ejecuta la aplicación e ingresa un título y un autor, y después da clic en el botón enviar para recibir la notificación inmediatamente.



8. Ajustes de Canal de Notificación
Al momento de escribir este artículo, no puedes cambiar con programación la configuración de ajustes específicos de canal de notificación. En su lugar, la única opción disponible es que el usuario vaya a la pantalla de ajustes de notificación para la aplicación en los ajustes del dispositivo. Desde ahí, el usuario puede acceder a los ajustes de notificación de aplicación para modificar ajustes tales como vibración, sonido, etc. Los usuarios pueden navegar a los ajustes de notificación de aplicación en cualquiera de las siguientes maneras:
- Dejando presionada la notificación en el cajón de notificación (imagen abajo a la izquierda).
- Ajustes > Aplicaciones y Notificaciones > Notificaciones > después seleccionando la aplicación (imagen abajo a la derecha).



También puedes enviar al usuario justo desde tu aplicación a los ajustes de notificación de canal. Veamos cómo hacer eso para el canal Android. Es recomendable que hagas esto en tus ajustes de aplicación para hacer fácil para que los usuarios accedan a estas opciones de notificación.
Edita la Retícula XML
Incluye otro botón que enviará al usuario a los ajustes de notificación de canal.
1 |
<!--...-->
|
2 |
<Button
|
3 |
android:id="@+id/btn_android_notif_settings" |
4 |
android:layout_width="match_parent" |
5 |
android:layout_height="wrap_content" |
6 |
android:text="Notification Settings"/> |
7 |
<!--...-->
|
Codifica el Intent
Aquí creamos un intenr y le pasamos una acción Settings—ACTION_CHANNEL_NOTIFICATION_SETTINGS (API 25)—y después agregamos algunos valores extra: el nombre de paquete de aplicación y id de canal. Finalmente, comenzamos la actividad de ajustes con el intent.
1 |
// ...
|
2 |
@Override
|
3 |
protected void onCreate(Bundle savedInstanceState) { |
4 |
//...
|
5 |
Button buttonAndroidNotifSettings = (Button) findViewById(R.id.btn_android_notif_settings); |
6 |
buttonAndroidNotifSettings.setOnClickListener(new View.OnClickListener() { |
7 |
|
8 |
@Override
|
9 |
public void onClick(View view) { |
10 |
Intent i = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); |
11 |
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); |
12 |
i.putExtra(Settings.EXTRA_CHANNEL_ID, NotificationUtils.ANDROID_CHANNEL_ID); |
13 |
startActivity(i); |
14 |
}
|
15 |
});
|
16 |
}
|
17 |
//...
|
Ejecuta la aplicación y da clic a los ajustes de notificación para el canal Android.



En los ajustes de notificación de canal, los usuarios pueden editar ajustes tales como habilitar vibraciones, cambiar la importancia, o mostrar una insignia (si es soportada) para el canal.
Si quieres llevar a los usuarios a los ajustes generales de notificación para tu aplicación, también puedes hacer eso con un Intent:
1 |
Intent i = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS); |
2 |
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()); |
3 |
startActivity(i); |
9. Crea Grupos de Notificaciones
También podemos agrupar canales de notificación en grupos para que puedan ser administrados juntos. Esto es útil para aplicaciones que soportan múltiples cuentas de usuario. Los mismos canales de notificación están disponibles a lo largo de cuentas individuales. Por ejemplo, una aplicación de red social podría incluir soporte para cuentas de usuario personales y de negocios. El código de abajo te muestra cómo crear un grupo de canal de notificación:
1 |
String groupId = "group_id_101"; |
2 |
CharSequence groupName = "Channel Name"; |
3 |
NotificationManager mNotificationManager = |
4 |
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); |
5 |
mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName)); |
Usamos el método createNotificationChannelGroup() de NotificationManager, pasándole una instancia de NotificationChannelGroup, que necesita el id de grupo y nombre de grupo para crear la instancia.
Una vez que está hecho, necesitamos conectar un canal de notificación a un grupo usando el método NotificationChannel.setGroup() y pasándole el id de grupo. Si quieres crear múltiples grupos de notificación a la vez, usa createNotificationChannelGroups(), pasándole una lista Java de instancias NotificationChannelGroup.
10. Borra un Canal de Notificación
Borrar un canal de notificación es sencillo si ya no se necesita. Solo usa el método del administrador de notificación deleteNotificationChannel() y pásale el id de canal.
1 |
NotificationManager mNotificationManager = |
2 |
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); |
3 |
mNotificationManager.deleteNotificationChannel(IOS_CHANNEL_ID); |
Sin embargo, ten en cuenta que los canales borrados permanecen visibles en los ajustes de notificación para prevenir spam.
Conclusión
En este tutorial, aprendiste sobre canales de notificación para Android O: qué son y cómo crear uno, así como cómo publicar una notificación a un canal, cómo acceder a los ajustes de notificación del canal, cómo agrupar canales de notificación, y cómo borrar un canal de notificación.
Para aprender más sobre Canales de Notificación, refiérete a la documentación oficial. Y mientras tanto, ¡revisa algunos de nuestros otros cursos y tutoriales sobre desarrollo Android!


Android SDKConsejo Rápido: Crea Texto Auto-dimensionable Con Android OJessica Thornsby

Android SDKCodifica una Aplicación Android de Galería de Imágenes Con GlideChike Mgbemena

Android SDKCómo Hacer Llamadas y Usar SMS en Aplicaciones AndroidChike Mgbemena

Android SDKComienza Con RxJava 2 para AndroidJessica Thornsby



