2016-02-06 2 views
8

をクリック:は、アクションの現在の通知を閉じ、私はアクションボタンとカスタム通知を持って

public class NotificationReceiver extends com.parse.ParsePushBroadcastReceiver { 
    @Override 
    public void onPushReceive(Context context, Intent intent) { 

    ... 

    NotificationActivity notification = new NotificationActivity(); 
    notification.createNotification(context, message, notificationId); 

    Log.i("tag", "Notification Received!"); 
} 

public class NotificationActivity { 

    public int notificationId; 

    public void createNotification(Context context, String message, String studentId, String notificationId){ 
     this.notificationId = Integer.parseInt(notificationId); 

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

     // notification 
     Notification.Builder mBuilder = new Notification.Builder(context); 
     mBuilder.setContentTitle("My Title"); 
     mBuilder.setContentText(message); 
     mBuilder.setDefaults(Notification.DEFAULT_VIBRATE); 
     mBuilder.setAutoCancel(true); 
     mBuilder.setStyle(new Notification.BigTextStyle() 
      .bigText(message)); 

     // cancel intent 
     Intent cancelIntent = new Intent(context, CancelNotification.class); 
     Bundle extras = new Bundle(); 
     extras.putInt("notification_id", this.notificationId); 
     cancelIntent.putExtras(extras); 
     PendingIntent pendingCancelIntent = 
      PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 
     mBuilder.addAction(R.drawable.notification_close, "Fechar", pendingCancelIntent); 

     // notify 
     Notification notification = mBuilder.build(); 
     notificationManager.notify(Integer.parseInt(notificationId), notification); 
    } 

    public static class CancelNotification extends BroadcastReceiver { 

     private int id; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      id = intent.getIntExtra("notification_id", 1); 
      NotificationManager notificationManager = 
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.cancel(id); 
     } 
    } 
} 

私は、「閉じる」アクションボタンをクリックした通知をキャンセルしたいです。

キャンセルの通知のIDが必要だと知っていますが、「閉じる」ボタンをクリックしてBroadCastReceiverを拡張するクラスCancelNotificationを作成したときのコードのやり方は、最終的な通知は、作成した最初の通知をクリックしても最後の通知を閉じています。

私は間違っている可能性がありますか?

+0

Notification.FLAG_AUTO_CANCELを追加しようとしましたか?この旗はあなたが期待している行動をしていますか? – W0rmH0le

+0

私はnotification.builderにあるすべてのもので質問を更新しました。今すぐ「閉じる」ボタンをクリックすると、何もしません。 – Ravers

+0

これらのボタンをクリックすると、インテントがシステムにブロードキャストされます。おそらく、あなたは意図を処理する必要があります..このasnwerを試してみてください:http://stackoverflow.com/q/16869777/4860513 – W0rmH0le

答えて

4

見つけた

あなたはpendingIntentが常にリクエストコード== 0を送信しています。

複数の通知があるので、それぞれ異なるrequestCodeを使用する必要があります。

ので、変更しよう:

から:

PendingIntent pendingCancelIntent = 
     PendingIntent.getBroadcast(context, 0, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 

へ:

PendingIntent pendingCancelIntent = 
     PendingIntent.getBroadcast(context, this.notificationId, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT) ; 

私はここにあなたのコードをテストし、それは私がやった変更後に働いています。

+0

私もhahah知っていた私のテスト中に、私は誤って "0"の代わりにIDを挿入し、それは働いていた。なぜチェックしている間に、私はその違いに気付き、歓迎!!最高のご協力ありがとうございます – W0rmH0le

+0

... "id = intent.getIntExtra(" notification_id "、1);で通知IDが取得された場合、なぜあなたが提案した変更(パラメータの変更)が効果を発揮するのでしょうか? –

+0

インテント作成中にこの問題の問題が発生しました。インテントは常にID = 0で作成されました。したがって、getIntExtra( "notification_id"、1)は常に0を返し、最後に受け取った通知のみがキャンセルされています(最初の通知をクリックしても)... – W0rmH0le

1

通知ビルダを使用する方が良いです。 相続人例:

NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(this); 
    mBuilder.setContentTitle("Your title"); 
    mBuilder.setOnlyAlertOnce(true); 
    mBuilder.setAutoCancel(true); 
    mBuilder.setContentText("main content") 
    mBuilder.setSubText("subtext") 

次のあなたは、あなたが通知にオープンしたい活動への意図を作成する必要があります。そして、あなたの通知マネージャーでき

notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 

    Notification notification = mBuilder.build(); 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    notificationManager.notify(notificationID, notification); 

通知IDを作成

intent = new Intent(this, MainActivity.class); 
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); 

をクリック任意の整数値である。このタイプを使用すると、通知のアンドロイドの規範に常に従うという利点があります。

+0

クール、どのようにBroadcastReceiverの通知Idを取得して、正しい通知をキャンセルしていることを確認しますか? –

関連する問題