如何通过单击通知来执行方法

我有一个应用程序与两个button。 一个“closures”应用程序和一个开始algorithm的button。 当我点击“开始”时,“隐藏”应用程序并在通知栏中显示通知。 当通知被点击/按下时,我需要能够执行/调用方法。 这类问题有几个答案,但是它们非常含糊,只能指向与BroadcastReceiver上文档的链接。

如果您打算给BroadcastReceiver文档留下一个url并说“阅读本页面”,请不要回复这个问题。 如果您要解释如何使用BroadcastReceiver执行方法(从显示通知的同一个类中),请向我演示一些如何完成这些操作的代码。

我的algorithm:按下button,显示通知,点击通知,调用方法(不显示活动)。 而已。

如果这是不可能的,请让我知道。 如果是这样,请告诉我你会做什么使之成为可能。 这个简单的东西不应该被android sdk的开发者忽略。

经过多次反复试验,我终于find了一个相当直接和干净的方法来运行一个任意的方法,当一个通知的动作被点击。 在我的解决scheme中,有一个类(我将称之为NotificationUtils)创build通知,并且还包含一个IntentService静态内部类,当点击通知的操作时将运行该内部类。 这里是我的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添加到<application>标记中的清单中:

 <service android:name=".NotificationUtils$NotificationActionService" /> 

概要:

  • 创build一个将创build通知的类。
  • 在这个类里面,添加一个IntentService内部类( 确保它是静态的,否则你会得到一个神秘的错误! ),它可以运行任何基于点击操作的方法。
  • 在清单中声明IntentService类。

通过通知单击我们不能得到任何火灾事件或任何点击侦听器,而在通知栏中添加您的应用程序,我们用它来设置一个通常启动一个活动,一旦通知单击或按下的等待意图。 但是我有一个解决scheme,如果你真的不想显示你的活动,那么将以未决意图开始的活动从那里发送一个广泛的演员到你的父母的活动,刚完成未决的活动,然后一旦广播接收机在父母的活动中接收任何你想要在接收器内的方法。 供你参考..

 // 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()); }