Android 在正确的活动中发送通知
我对Android(Xamarin)上的通知有问题。 我的设想是: 我有一个类处理(继承Android 在正确的活动中发送通知,android,android-intent,xamarin,push-notification,google-cloud-messaging,Android,Android Intent,Xamarin,Push Notification,Google Cloud Messaging,我对Android(Xamarin)上的通知有问题。 我的设想是: 我有一个类处理(继承GcmServiceBase)消息并创建通知对象。 在这个类中,我以这种方式重写了OnMessage方法: protected override void OnMessage(Context context, Intent intent) { if (intent != null || intent.Extras != null) { string messageText =
GcmServiceBase
)消息并创建通知对象。
在这个类中,我以这种方式重写了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);
}
如您所见,当收到消息时,我会测试应用程序对象是否存在,然后创建意图和通知对象(App.Instance
是一个单独的对象,包含有关应用程序本身的信息。mainActivity
是屏幕上显示的当前活动)
这样,当单击通知时,堆栈顶部的最后一个活动(如果应用程序位于前台,则为当前屏幕上的活动,或者应用程序进入后台之前的最后一个屏幕上的活动)将出现
启动,其中的某些内容将处理通知本身,由OnNewIntent
调用
除了一件事外,一切正常:
假设我有3个活动叫做A,B,C
当屏幕上的当前活动为A时,我启动应用程序,然后收到两个不同的通知。
两者都将显示在顶部栏中,不会出现问题。
我单击其中的第一个,它会要求我打开另一个活动(在当前活动的OnNewEvent
中捕获,并且由于通知类型),因此我说“是”,然后我将转换到活动C
到达活动C并完成一些工作后,我单击另一个通知
点击它,我将被带到活动A,然后通知将被处理。
我知道这个“问题”是因为在创建notify时,我使用了App.Instance.mainActivity.GetType()
来创建将用于创建pendingent
的意图,而在那个时候,两者都是活动A。
所以我的问题是:
如何处理屏幕上最后一个活动中的第二次通知单击(因此在活动C中)而不是活动A
(我添加Xamarin标记只是因为上面的代码是用C#编写的,而不是用Java编写的,所以对于本地Android开发人员来说可能听起来很奇怪)