Notifications — уведомления в Android

| 05.09.2014

В этом уроке мы научимся создавать простые уведомления — Notifications. Уведомления, по сути, являются сообщениями, чаще всего в виде иконок, появляющихся в статус-баре андроид-устройства. Это может быть просто какое-то сообщение о произошедшем событии, либо же уведомление с возможностью выполнить какое-то действие.

Notifications - уведомления в Android

Мы создадим простое приложение, в котором уведомление будет отправляться при нажатии на кнопку. После нажатия на уведомление будет открываться новое Активити.

Добавим строковые ресурсы — res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Notification</string>
    <string name="send_notification">Отправить уведомление</string>
    <string name="title_activity_new">NewActivity</string>
    <string name="test_notification">Тестовое уведомление</string>
    <string name="go_to_new_activity">Переход на новое активити</string>

</resources>

Добавим разметку для первого экрана с кнопкой — res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/send_notification"
        android:onClick="sendNotification"
        android:id="@+id/button" />

</LinearLayout>

Тут мы добавили атрибут android:onClick, чтобы все нажатия на кнопку отсылались методу sendNotification().

Добавим MainActivity.java

package ru.androiddocs.notification;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends ActionBarActivity {


    public static final int NOTIFICATION_ID = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void sendNotification(View v) {
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.ic_launcher)
                        .setContentTitle(getResources().getString(R.string.test_notification))
                        .setContentText(getResources().getString(R.string.go_to_new_activity));

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(NewActivity.class);

        Intent resultIntent = new Intent(this, NewActivity.class);
        stackBuilder.addNextIntent(resultIntent);

        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(
                        0,
                        PendingIntent.FLAG_UPDATE_CURRENT
               );
        mBuilder.setContentIntent(resultPendingIntent);

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

    }
}

При нажатии на кнопку мы создаем объект NotificationCompat.Builder для «конструирования» уведомления. Добавляем иконку для уведомления (используем из приложения, но вы можете задать свою), заголовок и короткое сообщение.

Также мы создаем TaskStackBuilder для построения корректной навигации. Мы помещаем наше Активити в стек и при нажатии на Back пользователь вернется на домашний экран. Задаем намерение — Intent, в котором указываем, какое активити нужно запустить при нажатии на уведомление. Также мы создаем объект PendingIntent и добавляем его в наш «построитель».

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

Макет второго Активити — res/layout/activity_new.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="ru.androiddocs.notification.NewActivity">

    <TextView
        android:text="@string/title_activity_new"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Код NewActivity.java

package ru.androiddocs.notification;

import android.app.NotificationManager;
import android.content.Context;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

public class NewActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.cancel(MainActivity.NOTIFICATION_ID);
    }
}

Здесь ничего особенного. В качестве примера показано, как можно «убрать» уведомление из статус-бара методом cancel().

Не забудьте прописать второе Активити в файле манифеста:

<activity
    android:name=".NewActivity"
    android:label="@string/title_activity_new" >
</activity>

Запускаем приложение и тестируем.

Notifications - уведомления в Android

Notifications - уведомления в Android

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*