来自通知栏的操作按钮无法运行Android

时间:2014-06-21 01:21:50

标签: java android

我正在为服务创建推送通知:

AppointmentService.java

Intent intent = new Intent(AppointmentService.this, ReAppointmentService.class);

intent.putExtra("id", id);

PendingIntent pIntent = PendingIntent.getService(AppointmentService.this, 0, intent, 0);

Notification n = new NotificationCompat.Builder(AppointmentService.this)
    .setContentTitle((String) snapshot.child("name").getValue())
    .setContentText("Hey!")
    .setSmallIcon(R.drawable.ic_launcher)
    .setAutoCancel(true)
    .addAction(R.drawable.ic_action_reply_light, "Hey yo!", pIntent)
    .build();

NotificationManager notificationManager = 
        (NotificationManager) HeyService.this.getSystemService(Activity.NOTIFICATION_SERVICE);

notificationManager.notify(getNotificationID(id), n);

ReAppointmentService.java     @覆盖     公共IBinder onBind(意图arg0)     {         return null;     }

@Override 
public int onStartCommand(Intent intent, int flags, int startId)
{
    Bundle extras = intent.getExtras();

    String id = extras.getString("id");

    gc = new GlobalContents(this);

    Firebase send = new Firebase("https://appointmentapp.firebaseio.com/app/"+id);

    Firebase ref = send.push();

    ref.runTransaction(new Transaction.Handler()
    {
          @Override
          public Transaction.Result doTransaction(MutableData ref)
          {
              ref.child("date").setValue(String.valueOf((new GregorianCalendar()).getTimeInMillis()));
              ref.child("name").setValue(gc.getName());
              ref.child("from").setValue(gc.getID());
              ref.child("seen").setValue(false);

              return Transaction.success(ref);
          }

          @Override
          public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {

          }
    });

    return START_NOT_STICKY; 
} 

通知通常会显示操作按钮。但是,当我点击按钮时,没有任何反应(我试图将一些日志放在ReAppointmentService上并且它不起作用)。

有什么问题?

2 个答案:

答案 0 :(得分:0)

PendingIntent.getService的最后一个参数应该几乎总是FLAG_UPDATE_CURRENT - 否则您的PendingIntent将不会根据PendingIntent上的文档更新新的附加内容:

  

PendingIntent本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其拥有的应用程序的进程被终止,PendingIntent本身也将保持可用于已经给出它的其他进程。如果创建应用程序稍后重新检索相同类型的PendingIntent(相同的操作,相同的Intent操作,数据,类别和组件以及相同的标志),它将接收表示同一令牌的PendingIntent,如果它仍然有效,并且可以因此调用cancel()将其删除。

     

由于这种行为,为了检索PendingIntent,重要的是要知道两个Intent何时被认为是相同的。人们常犯的一个错误就是使用Intent创建多个PendingIntent对象,这些Intent只在其" extra"内容,期望每次获得不同的PendingIntent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果你使用两个与Intent.filterEquals相同的Intent对象,那么你将获得两个相同的PendingIntent。

答案 1 :(得分:0)

  val intent = Intent(this, NotificationClickActivity::class.java)
    intent.apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    val pendingIntent = PendingIntent.getActivity(this,0,intent,0)

 val notificationBuilder = NotificationCompat.Builder(this,channelId)
                .setSmallIcon(R.drawable.ic_notifications)
                .setContentTitle("Title: API LEVEL " + Build.VERSION.SDK_INT)
                .setContentText("UUID: " + UUID.randomUUID())
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent)
                .addAction(R.drawable.ic_notifications,"Do Task",buttonPendingIntent)

        with(NotificationManagerCompat.from(this)){
            notify(1, notificationBuilder.build())