2017-12-11 12 views
0

私はアラームが発生するたびにアプリがユーザに通知を送信し、ユーザが通知をクリックしたか閉じているかを知ることができます。通知がクリックされていないか確認する

私の通知のためのコードは以下の通りです:

public override void OnReceive(Context context, Intent intent) 
{ 
    try 
    { 
     Settings.AlarmNotification = 1; 

      if (System.DateTime.Now.DayOfWeek == DayOfWeek.Thursday) 
      { 
       Settings.AlarmCount =0; 
      } 

      var title = "Test"; 
      var message = "Something"; 

      Intent backIntent = new Intent(context, typeof(MainActivity)); 
      backIntent.SetFlags(ActivityFlags.NewTask); 



      var resultIntent = new Intent(context, typeof(MainActivity)); 



      PendingIntent pending = PendingIntent.GetActivities(context, 0, 
       new Intent[] { backIntent, resultIntent }, 
       PendingIntentFlags.OneShot); 

      var builder = 
       new Notification.Builder(context) 
        .SetContentTitle(title) 
        .SetContentText(message) 
        .SetAutoCancel(true) 
        .SetSmallIcon(Resource.Drawable.icon) 
        .SetDefaults(NotificationDefaults.All); 

      builder.SetContentIntent(pending); 
      var notification = builder.Build(); 
      var manager = NotificationManager.FromContext(context); 
      manager.Notify(1331, notification); 

    } 
    catch (Exception) 
    { 

    } 
} 

答えて

2

Notification.BuilderNotificationCompat.Builder両方が(でも「CLEAR ALL」を持つ)あなたは、通知が閉じているときにBroadcastReceiverをトリガするために使用することができSetDeleteIntent方法があります。このBroadcastReceiverは、通知が自動キャンセルに設定されているため、通知がクリックされたときにもトリガーされます。

BroadcastReceiverに送信する第一に、セットアップPendingIntent

var deleteIntent = new Intent(context, typeof(NotificationBroadcastReceiver)); 
deleteIntent.SetAction("Action"); 
deleteIntent.PutExtra("key", key); 
// TODO: Set extras as needed. 
var deletePendingIntent = PendingIntent.GetBroadcast(context, _notificationId, deleteIntent, PendingIntentFlags.CancelCurrent); 

その後通知をPendingIntentを関連付ける:

var builder = new NotificationCompat.Builder(context, RouteUpdateChannelId) 
      .SetDefaults(NotificationCompat.DefaultAll) 
      .SetAutoCancel(true) 
      // TODO: Setup Notification 
      .SetDeleteIntent(deletePendingIntent); 

今、あなたはあなたのAndroidプロジェクトにBroadcastReceiverを追加することができます。

[BroadcastReceiver] 
public class NotificationBroadcastReceiver : BroadcastReceiver 
{ 
    public override void OnReceive(Context context, Intent intent) 
    { 
     if (intent.Action == "Action") 
     { 
      // TODO: Grab extras from the Intent as needed. 
      var key = intent.GetStringExtra("key"); 
      // TODO: Handle notification closing here... 
     } 
    } 
} 
2

yoユーザーが通知をクリックしたときにMainActivityを「トリガー」したい場合は、通知のPendingIntentIntentを設定して、それに渡す追加情報を含めます。

MainActivty
var title = "Winner, Winner, Chicken Dinner"; 
var message = "You just won a million StackOverflow reputation points"; 

var alarmIntent = new Intent(context, typeof(MainActivity)); 
alarmIntent.SetAction("ASushiNotification"); 
alarmIntent.PutExtra("MessageFromSushiHangover", message); 
var pending = PendingIntent.GetActivity(context, 0, alarmIntent, PendingIntentFlags.CancelCurrent); 

// set your notification as normal using ".SetContentIntent(pending)" 

は、それはすべて、すでに新しいものを始める対実行している場合ので、OSがアクティビティを再利用しますSingleTopにそのLaunchModeを設定します。

[Activity(Label = "A Super Duper App", MainLauncher = true, Icon = "@mipmap/icon", LaunchMode = Android.Content.PM.LaunchMode.SingleTop)] 

2つのエントリポイントがMainActvityにあります。通知インテントの場合、アクティビティがすでに実行されている場合、通知に設定するインテントとともにOnNewIntentが呼び出されます。アプリがで、が実行されていない場合は、MainActvityが通常通り作成されます。しかし、には、通知からのインテントが含まれます。意図とあなたがそれに適用される余分なデータで何かをする

方法(NotificationClickedOn)を作成します。あなたのMainActivty

void NotificationClickedOn(Intent intent) 
{ 
    if (intent.Action == "ASushiNotification" && intent.HasExtra("MessageFromSushiHangover")) 
    { 
     /// Do something now that you know the user clicked on the notifcation... 
     var notificationMessage = intent.Extras.GetString("MessageFromSushiHangover"); 
     var winnerToast = Toast.MakeText(this, $"{notificationMessage}.\n\n Please send 2 BitCoins to SushiHangover to process your winning ticket! ", ToastLength.Long); 
     winnerToast.SetGravity(Android.Views.GravityFlags.Center, 0, 0); 
     winnerToast.Show(); 
    } 
} 

は、OnNewIntentメソッドをオーバーライドして呼び出すNotificationClickedOn

protected override void OnNewIntent(Intent intent) 
{ 
    base.OnNewIntent(intent); 
    NotificationClickedOn(intent); 
} 

既存のOnCreateオーバーライドを電話に追加NotificationClickedOn

protected override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 
    SetContentView(Resource.Layout.Main); 

    ~~~~~ 

    NotificationClickedOn(Intent); 

    ~~~~~ 
} 

誰かがあなたの通知をクリックしたときに今、あなたはあなたのアプリケーションがすでに実行されたかどうかということを判断することができるようになります:

enter image description here

アプリケーション&活動が必要に応じて作成してMainActivity意志されます表示されるとトーストが表示されます。

enter image description here

+0

ユーザーはありませんをクリックした場合、私はちょうど設定変数に入れたいですtificationかどうか、私はMainActivityでif変数をtrueにした場合、これを行うことができます。 – Phill

+0

@Phill 'NotificationClickedOn'メソッドの設定変数を更新するには、' alarmIntent.SetAction'のようなID値を "UpdateSettings"のように設定し、渡されたインテントにそのアクションが含まれているかどうかを確認します。あなたの変数... – SushiHangover

+0

あなたの答えをありがとうが、@トレバーバルコムの答えは簡単で、私がしたいことをします。 – Phill

関連する問題