xamarin.forms - 从 Firebase 通知恢复应用程序不起作用(Xamarin 表单)
问题描述
我正在将firebase 推送通知集成到我的应用程序中。
请找到我的 firebase FirebaseMessagingService类。
如果应用程序已打开并运行一切正常。但是如果应用程序没有打开/如果我切换到其他应用程序(我的应用程序没有关闭)。我收到通知,但是当我点击通知时,它会重新启动应用程序而不恢复。
我 在我的主要活动中使用启动模式LaunchMode = LaunchMode.SingleTop 。
如果应用程序打开,我会在主要活动的OnNewIntent覆盖方法中得到响应。
谁能帮我找出真正的原因。请帮忙。
[Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class DriverAppMessagingService : FirebaseMessagingService
{
#region Overriden Methods
public override void OnMessageReceived(RemoteMessage message)
{
base.OnMessageReceived(message);
var parameters = new Dictionary<string, object>();
var notification = message.GetNotification();
if (null != notification)
{
if (!string.IsNullOrEmpty(notification.Body))
{
parameters.Add("Body", notification.Body);
}
if (!string.IsNullOrEmpty(notification.BodyLocalizationKey))
{
parameters.Add("BodyLocalizationKey", notification.BodyLocalizationKey);
}
// convert the incoming message to a local notification
SendLocalNotification(parameters);
// send the incoming message directly to the MainActivty
SendNotificationToMainActivity(parameters);
}
}
public override void OnNewToken(string p0)
{
base.OnNewToken(p0);
//Persist the token to app settings for registration purpose.
AppDefinition.Helpers.Settings.Current.PnsHandle = p0;
}
#endregion
#region Private Methods
/// <summary>
///
/// </summary>
/// <param name="args"></param>
private void SendNotificationToMainActivity(Dictionary<string, object> args)
{
if (CrossCurrentActivity.Current.Activity is MainActivity activity)
{
var message = args["Body"].ToString();
activity.TriggerPushNotification(message);
}
}
/// <summary>
/// Method to trigger the local notification.
/// </summary>
/// <param name="args"></param>
private void SendLocalNotification(Dictionary<string, object> args)
{
//TODO Only using one token from message response.
var message = args["Body"].ToString();
var intent = new Intent(CrossCurrentActivity.Current.Activity, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
intent.PutExtra("message", message);
var pendingIntent = PendingIntent.GetActivity(CrossCurrentActivity.Current.Activity, 0, intent, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.OneShot);
var notificationBuilder = new NotificationCompat.Builder(CrossCurrentActivity.Current.Activity, Constants.NotificationChannelName)
.SetContentTitle(Constants.ContentTitle)
.SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
.SetContentText(message)
.SetAutoCancel(true)
.SetShowWhen(false)
.SetLights(0xff0000, 100, 100)
.SetContentIntent(pendingIntent);
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
notificationBuilder.SetChannelId(Constants.NotificationChannelName);
}
var notificationManager = NotificationManager.FromContext(CrossCurrentActivity.Current.Activity);
notificationManager.Notify(0, notificationBuilder.Build());
}
#endregion
}
解决方案
当您设置 MainActivityLaunchMode = LaunchMode.SingleTop
并设置ActivityFlags.ClearTop
时,当您点击通知打开您的应用程序时,它将清除 MainActivity 上方的所有活动并将 MainActivity 放在堆栈的顶部。它不是重新创建 MainActivity,而是进入OnNewIntent
方法。
您可以在OnCreate
方法中设置断点,当您在点击通知后打开应用程序时,它不会进入它。
推荐阅读
- google-chrome - localhost 的 Chrome 扩展权限在 manifest.js 中不起作用
- android - MVVM:复杂视图/视图模型-> 多个 LiveData 对象?
- c# - 是否可以为 wpf 边框圆角的“外部”区域着色
- java - 带有 BootstrapMode.DEFERRED 的 Spring Data Jpa 多个 @EnableJpaRepositories 不起作用
- node.js - 使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名
- java - 线图 x 轴值在库 MPAndroidchart 中重复
- c# - 如何绕过 ASMX 的输入验证
- json - asp.net core 2.1 json序列化空数组不被忽略
- javascript - 如何正确解决这个 knex.js 承诺?
- gradle - gradle 获取子项目名称、版本