确定的addAction点击Android的通知 [英] Determine addAction click for Android notifications
问题描述
我试图用新的通知界面。我已经添加了3个按钮的通知,我想的东西保存到我的数据库,一旦他们每个人的点击。
I'm trying to use the new notifications interface. I've added 3 buttons to the notifications, and I want to save something to my database once each of them is clicked.
本身运作良好,并显示调用时的通知,我只是不知道如何捕捉每三个不同的按钮点击。
The notification itself works well and is shown when called, I just don't know how to capture each of the three different button clicks.
我使用了一个的BroadcastReceiver
赶点击,但我不知道怎么告诉哪个按钮被点击。
I'm using a BroadcastReceiver
to catch the clicks, but I don't know how to tell which button was clicked.
这是的addAction
的code(我已经排除了通知的其余部分,因为它的工作好) -
This is the code of AddAction
(I've excluded the rest of the notification, as it's working well) -
//Yes intent
Intent yesReceive = new Intent();
yesReceive.setAction(CUSTOM_INTENT);
Bundle yesBundle = new Bundle();
yesBundle.putInt("userAnswer", 1);//This is the value I want to pass
yesReceive.putExtras(yesBundle);
PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes);
//Maybe intent
Intent maybeReceive = new Intent();
maybeReceive.setAction(CUSTOM_INTENT);
Bundle maybeBundle = new Bundle();
maybeBundle.putInt("userAnswer", 3);//This is the value I want to pass
maybeReceive.putExtras(maybeBundle);
PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe);
//No intent
Intent noReceive = new Intent();
noReceive.setAction(CUSTOM_INTENT);
Bundle noBundle = new Bundle();
noBundle.putInt("userAnswer", 2);//This is the value I want to pass
noReceive.putExtras(noBundle);
PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo);
这是的code中的的BroadcastReceiver
-
This is the code of the BroadcastReceiver
-
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("shuffTest","I Arrived!!!!");
//Toast.makeText(context, "Alarm worked!!", Toast.LENGTH_LONG).show();
Bundle answerBundle = intent.getExtras();
int userAnswer = answerBundle.getInt("userAnswer");
if(userAnswer == 1)
{
Log.v("shuffTest","Pressed YES");
}
else if(userAnswer == 2)
{
Log.v("shuffTest","Pressed NO");
}
else if(userAnswer == 3)
{
Log.v("shuffTest","Pressed MAYBE");
}
}
}
我已经注册了的BroadcastReceiver
在清单中。
另外,我想提的是,的BroadcastReceiver
被称为当我点击通知中的按钮中的一个,但目的总是包含'2'的额外费用。
I've registered the BroadcastReceiver
in the Manifest.
Also, I want to mention that the BroadcastReceiver
is called when I click one of the buttons in the notification, but the intent always includes an extra of '2'.
这是notifcation iteslf -
This is the notifcation iteslf -
推荐答案
这是因为你使用<一个href="http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT">FLAG_UPDATE_CURRENT与具有相同的操作意图
It's because you're using FLAG_UPDATE_CURRENT with Intents that have the same action
从文档:
如果所描述的PendingIntent已经存在,那么保留它,但它与什么是在这个新的意图取代其额外数据。
if the described PendingIntent already exists, then keep it but its replace its extra data with what is in this new Intent.
在指定 pendingIntentMaybe
和 pendingIntentNo
,系统将使用 PendingIntent
为 pendingIntentYes
,但它覆盖的花絮。因此,所有三个变量指向同一个对象,指定的最后一个演员是为 pendingIntentNo
。
When you specify pendingIntentMaybe
and pendingIntentNo
, the system uses the PendingIntent
created for pendingIntentYes
, but it overwrites the extras. Thus, all three variables refer to the same object, and the last extras specified were for pendingIntentNo
.
您应该为每个替代操作意图
。你仍然可以有一个的BroadcastReceiver
,只是把它拦截所有三个动作。这将是减少混乱语义以及:)
You should specify an alternative action for each Intent
. You can still have one BroadcastReceiver
, and just have it intercept all three actions. This would be less confusing semantically as well :)
您通知海报:
//Yes intent
Intent yesReceive = new Intent();
yesReceive.setAction(YES_ACTION);
PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes);
//Maybe intent
Intent maybeReceive = new Intent();
maybeReceive.setAction(MAYBE_ACTION);
PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe);
//No intent
Intent noReceive = new Intent();
noReceive.setAction(NO_ACTION);
PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo);
您接收器:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(YES_ACTION.equals(action)) {
Log.v("shuffTest","Pressed YES");
} else if(MAYBE_ACTION.equals(action)) {
Log.v("shuffTest","Pressed NO");
} else if(NO_ACTION.equals(action)) {
Log.v("shuffTest","Pressed MAYBE");
}
}
这篇关于确定的addAction点击Android的通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!