34

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

如果您要在 BroadcastReceiver 文档中留下 URL 并说“阅读此页面”,请不要回复此问题。如果你要解释我如何使用 BroadcastReceiver 来执行一个方法(在显示通知的同一个类中),请给我一些代码来说明如何做到这一点。

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

如果不可能,请告诉我。如果是的话,请告诉我你会做些什么来使它成为可能。android sdk 的开发人员不应该忽视这么简单的事情。

4

2 回答 2

41

经过几次反复试验和错误,我终于找到了一种相当简单明了的方法来在单击通知的操作时运行任意方法。在我的解决方案中,有一个类(我将其称为 NotificationUtils)创建通知,还包含一个 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" />

概括:

  • 创建一个将创建通知的类。
  • 在该类中,添加一个 IntentService 内部类(确保它是静态的,否则您将收到一个神秘的错误!),它可以根据单击的操作运行任何方法。
  • 在清单中声明 IntentService 类。
于 2015-04-07T03:26:59.607 回答
13

在通知单击时,我们无法获得任何触发事件或任何单击侦听器。当我们在通知栏中添加通知时,我们可以设置一个待处理的意图,它会在点击通知时触发一个意图(活动/服务/广播)。

我有一个适合您的解决方案,如果您真的不想显示您的活动,那么将以待定意图开始的活动从那里向您的父活动发送广播,然后完成待定活动,然后一旦广播接收器在父活动中接收接收器中您想要的任何方法。供你参考..

// This is what you are going to set a pending intent which will start once
// notification is clicked. 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"));
    }
}
于 2012-06-30T04:19:59.750 回答