以正确的活动调度通知

时间:2015-11-13 08:15:21

标签: android android-intent xamarin push-notification google-cloud-messaging

我在Android上遇到通知问题(Xamarin)。 我的情况是这样的: 我有一个类处理(继承GcmServiceBase)消息并创建Notification对象。 在本课程中,我以这种方式覆盖OnMessage方法:

protected override void OnMessage(Context context, Intent intent)
{
    if (intent != null || intent.Extras != null)
    {
        string messageText = intent.Extras.GetString("message");
        string messageTitle = intent.Extras.GetString("title");
        Intent app_launch_intent = new Intent(context, typeof(Project.WaitForm));         
    if (App.Instance == null)
    {
        Console.WriteLine("GCM: Notification received while application not running...");  
        app_launch_intent.AddFlags(ActivityFlags.ClearTop);
        app_launch_intent.AddFlags(ActivityFlags.SingleTop);
    }

    else if ((App.Instance != null) && (App.Instance.mainActivity.IsInBackground))
    {
        App.Instance.Logger.Write("GCM: Notification received while application in background...", LogType.Default, LogLevel.Info);
        app_launch_intent = new Intent(context, App.Instance.mainActivity.GetType());
    }

    else
    {
        App.Instance.Logger.Write("GCM: Notification received while application in foreground...", LogType.Default, LogLevel.Info);
        app_launch_intent = new Intent(context, App.Instance.mainActivity.GetType());
        app_launch_intent.AddFlags(ActivityFlags.SingleTop);
    }

    app_launch_intent.PutExtras(intent.Extras);
    app_launch_intent.PutExtra("isNotify", true);
    PendingIntent pendingIntent = PendingIntent.GetActivity(this, PushService.notificationId, app_launch_intent, PendingIntentFlags.OneShot);
    createNotification(context, app_launch_intent, pendingIntent, messageTitle, messageText);
    if (App.Instance == null)
    {
        Console.WriteLine("GCM: Notification object correctly created."); 
    }
    else
    {
        App.Instance.Logger.Write("GCM: Notification object correctly created.", LogType.Default, LogLevel.Info);
    }
    }
}

public void createNotification(Context context, Intent result_intent, PendingIntent pendingIntent,  string title, string desc)
{
    NotificationManager notificationManager = GetSystemService(Context.NotificationService) as NotificationManager;

Notification.Builder builder = new Notification.Builder(this)
    .SetContentIntent(pendingIntent)
    .SetAutoCancel(true)
    .SetContentTitle(title)
    .SetContentText(desc)
    .SetSmallIcon(Resource.Drawable.notify_icon_transparent)
    .SetLargeIcon(PushService.IconAgenda)
    .SetTicker(title);
Notification notification = builder.Build();
PushService.notificationId += 1;
notificationManager.Notify(PushService.notificationId, notification);

}

正如您所看到的,当收到消息时,我测试是否存在应用程序对象然后我创建了Intent和通知对象(App.Instance是一个单独存储有关应用程序本身的信息。mainActivity是当前活动显示在屏幕上。)

以这种方式点击通知时,堆栈顶部的最后一个活动(当应用程序处于前台时的当前屏幕活动或应用程序进入后台之前的最后一次屏幕活动)将会到来  up和其中的某些内容会关注通知本身,由OnNewIntent调用。

除了一件事以外,一切都很好:

我们说我有3个活动名为A,B,C。

我启动应用程序,然后当屏幕上的当前活动为A时,我收到2个不同的通知。  两者都将显示在顶部栏中没有问题。  我点击它们中的第一个,它要求我打开另一个活动(在当前活动的OnNewEvent中捕获并且由于通知类型),所以我说"是"我将转换到活动C。

一旦达到活动C并完成一些工作后,我点击另一个通知。

点击它我将被带到活动A,然后通知将被处理。  我知道这个"问题"是因为在创建通知时我使用App.Instance.mainActivity.GetType()来创建将用于创建PendingIntent的意图,并且那时两者都是活动A.  所以我的问题是:

如何在屏幕上的最后一项活动中处理第二次通知点击(因此在活动C中)而非活动A?

(我添加Xamarin标签只是因为上面的代码是在C#中而不是在Java中,因此对于原生的Android开发人员来说可能听起来很奇怪)

0 个答案:

没有答案