新しい通知インターフェイスを使用しようとしています。通知に3つのボタンを追加しました。それぞれのボタンをクリックしたら、データベースに何かを保存したいと思います。
通知自体はうまく機能し、呼び出されたときに表示されます。3つの異なるボタンクリックのそれぞれをキャプチャする方法がわかりません。
クリックをキャッチするためにBroadcastReceiver
を使用していますが、どのボタンがクリックされたかを知る方法がわかりません。
これはAddAction
のコードです(正常に機能するため、残りの通知は除外しました)-
//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);
これは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
を登録しました。また、通知のボタンの1つをクリックするとBroadcastReceiver
が呼び出されますが、インテントには常に「2」が追加されます。
これは通知の繰り返しです-
これは、同じアクションを持つインテントで FLAG_UPDATE_CURRENT を使用しているためです
ドキュメントから:
記述されたPendingIntentが既に存在する場合、それを保持しますが、その追加データをこの新しいIntentにあるもので置き換えます。
pendingIntentMaybe
およびpendingIntentNo
を指定すると、システムはPendingIntent
用に作成されたpendingIntentYes
を使用しますが、余分なものは上書きされます。したがって、3つの変数はすべて同じオブジェクトを参照し、最後に指定された追加はpendingIntentNo
用でした。
Intent
ごとに代替アクションを指定する必要があります。まだ1つのBroadcastReceiver
を使用でき、3つのアクションすべてをインターセプトするだけです。これは意味的にも混乱が少ないでしょう:)
通知ポスター:
//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");
}
}
STEP_BY_STEP
ステップ1
public void noto2() // paste in activity
{
Notification.Builder notif;
NotificationManager nm;
notif = new Notification.Builder(getApplicationContext());
notif.setSmallIcon(R.drawable.back_dialog);
notif.setContentTitle("");
Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notif.setSound(path);
nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent yesReceive = new Intent();
yesReceive.setAction(AppConstant.YES_ACTION);
PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT);
notif.addAction(R.drawable.back_dialog, "Yes", pendingIntentYes);
Intent yesReceive2 = new Intent();
yesReceive2.setAction(AppConstant.STOP_ACTION);
PendingIntent pendingIntentYes2 = PendingIntent.getBroadcast(this, 12345, yesReceive2, PendingIntent.FLAG_UPDATE_CURRENT);
notif.addAction(R.drawable.back_dialog, "No", pendingIntentYes2);
nm.notify(10, notif.getNotification());
}
ステップ1.5
グローバルクラスAppConstantを作成しました
public class AppConstant
{
public static final String YES_ACTION = "YES_ACTION";
public static final String STOP_ACTION = "STOP_ACTION";
}
ステップ2:
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (AppConstant.YES_ACTION.equals(action)) {
Toast.makeText(context, "YES CALLED", Toast.LENGTH_SHORT).show();
}
else if (AppConstant.STOP_ACTION.equals(action)) {
Toast.makeText(context, "STOP CALLED", Toast.LENGTH_SHORT).show();
}
}
}
ステップ
<receiver Android:name=".NotificationReceiver">
<intent-filter>
<action Android:name="YES_ACTION"/>
<action Android:name="STOP_ACTION"/>
</intent-filter>
</receiver>
私の場合、intent-filterを追加した後、私のために働いた
<receiver Android:name=".AlarmReceiver">
<intent-filter>
<action Android:name="YES_ACTION"/>
<action Android:name="NO_ACTION"/>
<action Android:name="MAYBE_ACTION"/>
</intent-filter>
</receiver>
ここYES_ACTION
はyourfullpackagename.YES
でなければなりません
好む
private static final String YES_ACTION = "com.example.packagename.YES";
同様に、NO_ACTION
またはMAYBE_ACTION
を使用できます
BroadcastReceiverでは、上記で宣言したのと同じYES_ACTION
を使用する必要があります。
broadcastReceiverクラスでは、次の方法でカスタムブロードキャストを確認できます。
public class NotificationReceiver extends BroadcastReceiver {
private static final String YES_ACTION = "com.example.packagename.YES";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if(YES_ACTION.equals(action)) {
Toast.makeText(context, "CALLED", Toast.LENGTH_SHORT).show();
}
}
}
注:YES_ACTION文字列のYESの代わりに、他のWordも使用できます。