如何检测Notification Android中是否按下了是或否

时间:2017-07-20 09:47:45

标签: android android-intent broadcastreceiver android-toast

以下是我的代码。我已经使用addaction对通知进行了操作(是或否)。但问题是我无法检测是否按下了.Plz帮助..谢谢

@SuppressWarnings("deprecation")
@Override
protected void onIncomingCallReceived(final Context ctx, final String number, final Date start) {
    // Create Intent for notification
    Intent intent = new Intent(ctx, CallReceiver.class);
    PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    //Yes intent
    Intent yesReceive = new Intent();
    yesReceive.setAction(YES_ACTION);
    PendingIntent pendingIntentYes = PendingIntent.getBroadcast(ctx, 0, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);


    //No intent
    Intent noReceive = new Intent();
    noReceive.setAction(NO_ACTION);
    PendingIntent pendingIntentNo = PendingIntent.getBroadcast(ctx, 0, noReceive, PendingIntent.FLAG_UPDATE_CURRENT);


    // Defining notification
    NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(
            ctx).setSmallIcon(R.mipmap.ic_launcher)

            .setContentTitle("Sample text 1 ?")

            .setContentText("Sample text 2").setContentIntent(pi)
            .addAction(R.drawable.ic_done_white_36dp, "Yes", pendingIntentYes)
            .addAction(R.drawable.ic_close_white_36dp, "No", pendingIntentNo);
    // Allows notification to be cancelled when user clicks it
    nBuilder.setAutoCancel(true);

    // Issuing notification

    int notificationId = 0;
    NotificationManager notifyMgr = (NotificationManager) ctx.getSystemService(NOTIFICATION_SERVICE);
    String action = intent.getAction();
    if (CallReceiver.YES_ACTION.equals(action)) {
        Toast.makeText(ctx, "YES CALLED", Toast.LENGTH_SHORT).show();
    } else if (CallReceiver.NO_ACTION.equals(action)) {
        Toast.makeText(ctx, "STOP CALLED", Toast.LENGTH_SHORT).show();
    }
    notifyMgr.notify(notificationId, nBuilder.build());

}

此代码位于我的CallReciever.class中,它扩展了Phonecallreciever 其中,phonecallreciever扩展了broadcastreciver。

2 个答案:

答案 0 :(得分:0)

这不是它的工作原理。您必须使用BroadcastReciever观察此操作,并在ActivityFragmentService中注册。

IntentFilter filter = new IntentFilter();
filter.addAction(YES_ACTION);
filter.addAction(NO_ACTION);

BroadcastReceiver receiver = new BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (CallReceiver.YES_ACTION.equals(action)) {
             Toast.makeText(ctx, "YES CALLED", Toast.LENGTH_SHORT).show();
        } else if (CallReceiver.NO_ACTION.equals(action)) {
             Toast.makeText(ctx, "STOP CALLED", Toast.LENGTH_SHORT).show();
        }
    }
}
context.registerReceiver(receiver, filter);

ActivityFragmentService被销毁时,请不要忘记取消注册。

答案 1 :(得分:0)

在每个操作中,您需要声明一个PendingIntent,它将在用户单击它之后处理该操作。在此PendingIntent中,如果使用Intent.putExtra(键,值),则可以轻松传递数据,然后从已声明的广播接收器中检索此数据。

  //done action button
    Intent doneIntent = new Intent(this, NotificationDoneReceiver.class);
    doneIntent.putExtra("id", id);
    doneIntent.putExtra("notification_id",unique_id);
    PendingIntent donePendingIntent = PendingIntent.getBroadcast(this, (unique_id * 16), doneIntent, 0);

 //create the notification
    Notification n = builder
            //set title
            .setContentTitle(title)

            .setPriority(NotificationCompat.PRIORITY_MAX)

            .setWhen(0)
                    //set content
            .setContentText(getString(R.string.time_for_medicine) + " " + medicine)
                    //set intent to launch on content click
            .setContentIntent(pIntent)
                    //cancel notification on click
            .setAutoCancel(true)
                    //add the actions
            .addAction(R.drawable.ic_done, getString(R.string.took_it), donePendingIntent)

            .build();

已完成操作的广播接收器。

public class NotificationDoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    int id = intent.getExtras().getInt("id");
    int notification_id = intent.getExtras().getInt("notification_id");

    RealmDatabase db = new RealmDatabase(context);
    MedicationPlanEvent medicationPlanEvent = db.getMedicationPlanEventBasedOnID(id);

    if(medicationPlanEvent!=null){
        Medication medication = new Medication(medicationPlanEvent.getMedicine(), TimeManager.getCurrentDate(),medicationPlanEvent.getDose(),TimeManager.getCurrentTime(),"",medicationPlanEvent.getDose_meter());
        medication.setId(db.getMedicationNextKey());

        db.insertMedication(medication);
    }


    //notification manager
    NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

    notificationManager.cancel(notification_id);

    Intent overviewIntent = new Intent(context.getApplicationContext(), OverviewActivity.class);
    overviewIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(overviewIntent);


}

}