Как выполнить метод, нажав на уведомление

У меня есть приложение с двумя кнопками. Одна кнопка, которая «закрывает» приложение и запускает алгоритм. Когда я нажимаю «начинать», он «скрывает» приложение и отображает уведомление в панели уведомлений. Мне нужно иметь возможность выполнять / вызывать метод при нажатии / нажатии на уведомление. На этот вопрос есть несколько ответов, но они невероятно расплывчаты и указывают только на ссылку на документ на BroadcastReceiver.

Если вы собираетесь оставить URL-адрес документа BroadcastReceiver и сказать «прочитайте эту страницу», пожалуйста, не отвечайте на этот вопрос. Если вы собираетесь объяснить, как я могу использовать BroadcastReceiver для выполнения метода (из того же classа, который отобразил уведомление), пожалуйста, покажите мне какой-то код, как это можно сделать.

Мой алгоритм: нажмите кнопку, покажите уведомление, нажмите уведомление, вызовите метод (не отображать активность). Вот и все.

Если это невозможно, просто дайте мне знать. Если да, пожалуйста, покажите мне, что вы сделали бы, чтобы это стало возможным. Что-то такое простое не должно было быть упущено разработчиками android sdk.

После нескольких итераций проб и ошибок я наконец нашел довольно простой и чистый способ запуска произвольного метода при нажатии на действие уведомления. В моем решении есть один class (я назову его NotificationUtils), который создает уведомление, а также содержит статический внутренний class IntentService, который будет запускаться при нажатии на действия над уведомлением. Вот мой class NotificationUtils, за которым следуют необходимые изменения в AndroidManifest.xml:

public class NotificationUtils { public static final int NOTIFICATION_ID = 1; public static final String ACTION_1 = "action_1"; public static void displayNotification(Context context) { Intent action1Intent = new Intent(context, NotificationActionService.class) .setAction(ACTION_1); PendingIntent action1PendingIntent = PendingIntent.getService(context, 0, action1Intent, PendingIntent.FLAG_ONE_SHOT); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Sample Notification") .setContentText("Notification text goes here") .addAction(new NotificationCompat.Action(R.drawable.ic_launcher, "Action 1", action1PendingIntent)); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build()); } public static class NotificationActionService extends IntentService { public NotificationActionService() { super(NotificationActionService.class.getSimpleName()); } @Override protected void onHandleIntent(Intent intent) { String action = intent.getAction(); DebugUtils.log("Received notification action: " + action); if (ACTION_1.equals(action)) { // TODO: handle action 1. // If you want to cancel the notification: NotificationManagerCompat.from(this).cancel(NOTIFICATION_ID); } } } 

Теперь просто выполните свои действия в onHandleIntent и добавьте NotificationActionService в ваш манифест в тегах :

  

Резюме:

  • Создайте class, который будет создавать уведомление.
  • Внутри этого classа добавьте внутренние classы IntentService ( убедитесь, что они статичны или вы получите загадочную ошибку! ), Которые могут запускать любой метод на основе действия, которое было нажато.
  • Объявите class IntentService в вашем манифесте.

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

 // This is what you are going to set a pending intent which will start once // notification is pressed. Hopes you know how to add notification bar. Intent notificationIntent = new Intent(this, dummy_activity.class); notificationIntent.setAction("android.intent.action.MAIN"); notificationIntent.addCategory("android.intent.category.LAUNCHER"); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT | Notification.FLAG_AUTO_CANCEL); // Now, once this dummy activity starts send a broad cast to your parent activity and finish the pending activity //(remember you need to register your broadcast action here to receive). BroadcastReceiver call_method = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action_name = intent.getAction(); if (action_name.equals("call_method")) { // call your method here and do what ever you want. } }; }; registerReceiver(call_method, new IntentFilter("call_method")); } } 
 protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setAutoCancel(true); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received UnRead message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.icon2); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, FreesmsLog.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(FreesmsLog.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); } 
  • android: запуск фоновой задачи с помощью AlarmManager
  • возобновление деятельности извещения
  • Android - создайте уведомление, TaskStackBuilder.addParentStack не работает
  • Android Notification Sound
  • Проверить доступ к уведомлениям с помощью NotificationListenerService
  • Лучший способ сериализации NSData в hexadeximal string
  • Обновить текст уведомления, а не целое уведомление
  • Откройте приложение после нажатия кнопки «Уведомление»
  • Истекает ли идентификатор регистрации GCM?
  • PendingIntent работает правильно для первого уведомления, но неправильно для остальных
  • Push-уведомления, когда приложение закрыто
  • Давайте будем гением компьютера.