Создавая кнопки в уведомлении нельзя просто назначить им слушатели, как мы привыкли делать редактируя интерфейс пользователя. Основным способом назначения действий в уведомлении являются интенты (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
