Создавая кнопки в уведомлении нельзя просто назначить им слушатели, как мы привыкли делать редактируя интерфейс пользователя. Основным способом назначения действий в уведомлении являются интенты (Intent) — намерения.
И если для того, чтобы назначить кнопке действия перехода в какую-либо Activity достаточно просто создать соответствующий интент, внутри которого и будет описано необходимое действие, а именно — откуда и куда переходим, то в нашем случае необходимо будет сделать следующее: назначить кнопке намерение, передать ему Action для работы с интент фильтром, создать BroadcastReciver, который будет вылавливать наш Intent и уже тогда выполнять необходимый нам метод.
Итак, для начала создадим наше уведомление. В своем примере я вынес все следующие действия в отдельный метод sendNotification. Но прежде нам необходимо создать строку, в которую мы запишем ключ для того, чтобы наш приемник мог отловить именно наш Intent. Так как множество приложений постоянно вбрасывают интенты в систему, этот ключ должен быть уникальным
Теперь необходимо создать приемник BroadCastReciver. Для этого необходимо щелкнуть ПКМ по вашей папке app->New->Other->BroadcastReciver. Далее дайте ему имя, и в открывшемся файле нам необходимо убрать заглушку в виде вброса исключения, написав на ее месте наш метод
Но помимо этого нам необходимо настроить Intent Filter для нашего приемника, чтобы дать ему понять, какие именно Inetnt ему надо принимать. Для этого заходим в манифест и блоке кода нашего приемника прописываем Intent Filter, куда записываем содержимое строковой переменной BROADCAST_ACTION созданной в самом начале
Вот и все, теперь в случае нажатия на созданную нами кнопку в уведомлении будет запускаться метод, определенный в теле BroadcastReciver
И если для того, чтобы назначить кнопке действия перехода в какую-либо Activity достаточно просто создать соответствующий интент, внутри которого и будет описано необходимое действие, а именно — откуда и куда переходим, то в нашем случае необходимо будет сделать следующее: назначить кнопке намерение, передать ему Action для работы с интент фильтром, создать BroadcastReciver, который будет вылавливать наш Intent и уже тогда выполнять необходимый нам метод.
Итак, для начала создадим наше уведомление. В своем примере я вынес все следующие действия в отдельный метод sendNotification. Но прежде нам необходимо создать строку, в которую мы запишем ключ для того, чтобы наш приемник мог отловить именно наш Intent. Так как множество приложений постоянно вбрасывают интенты в систему, этот ключ должен быть уникальным
//Создаем уникальный ключ
String BROADCAST_ACTION = "com.example.uniqueTag";
public void sendNotification () {
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
Intent intent = new Intent(BROADCAST_ACTION);
//В следующей строке мы определяем кто именно будет обрабатывать наш Intent с помощью .getBroadcast
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intentStopTrip, 0);
//Создаем уведомление
Notification BuilderNote =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_example)
.setContentTitle("Example title")
.setContentText("Example text")
.setContentIntent(pendingIntentPush)
//Далее мы создадим кнопку и присвоим ей наш pendingIntent
.addAction(R.mipmap.ic_example, "Button name", pendingIntent)
.build();
//Установим необходимые флаги
BuilderNote.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, BuilderNote);
}
Теперь необходимо создать приемник BroadCastReciver. Для этого необходимо щелкнуть ПКМ по вашей папке app->New->Other->BroadcastReciver. Далее дайте ему имя, и в открывшемся файле нам необходимо убрать заглушку в виде вброса исключения, написав на ее месте наш метод
public class ExampleReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
exampleMethod();
}
}
Но помимо этого нам необходимо настроить Intent Filter для нашего приемника, чтобы дать ему понять, какие именно Inetnt ему надо принимать. Для этого заходим в манифест и блоке кода нашего приемника прописываем Intent Filter, куда записываем содержимое строковой переменной BROADCAST_ACTION созданной в самом начале
<receiver
android:name=".StopTimerReciver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.uniqueTag" />
</intent-filter>
</receiver>
Вот и все, теперь в случае нажатия на созданную нами кнопку в уведомлении будет запускаться метод, определенный в теле BroadcastReciver