gpt4 book ai didi

c# - 推送通知上的应用程序重新加载单击 Xamarin Forms

转载 作者:太空狗 更新时间:2023-10-29 23:05:22 24 4
gpt4 key购买 nike

我已经在我的应用程序上实现了推送通知,它们运行良好。我遇到的问题是,当我在下拉菜单中单击它们时,它们会立即重新加载应用程序。为了解决这个问题,我让应用程序创建了一个新的事件实例。这现在打开了一个新页面,但是当从这个新页面点击返回时它有同样的问题并再次重新加载整个应用程序。

我在 PCL 中使用 Xamarin Forms,因此它不是纯 Android。有没有办法让菜单项上的点击事件加载 PCL 中的特定页面 View ?重新加载整个应用有点没用。

这是创建电话通知的类:

ForegroundMessages.cs:

 [Service]
[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]

public class ForegroundMessages: FirebaseMessagingService
{


const string TAG = "MyFirebaseMsgService";
public override void OnMessageReceived(RemoteMessage message)
{
//Log.Debug(TAG, "From: " + message.From);
//Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
base.OnMessageReceived(message);
SendNotification(message.GetNotification().Body);
}

private void SendNotification(string body)
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
// var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);

Log.Debug(TAG, "Notification Message Body: " + body);

// sends notification to view model
MessagingCenter.Send((App)Xamarin.Forms.Application.Current, "Increase");

Intent resultintent = new Intent(this,typeof(SecondActivity));

TaskStackBuilder stackbuilder = TaskStackBuilder.Create(this);
stackbuilder.AddParentStack(Java.Lang.Class.FromType(typeof(SecondActivity)));
stackbuilder.AddNextIntent(resultintent);

PendingIntent resultPendingIntent = stackbuilder.GetPendingIntent(0, (int)PendingIntentFlags.UpdateCurrent);

var defaultSoundUri = RingtoneManager.GetDefaultUri(RingtoneType.Notification);
var notificationBuilder = new NotificationCompat.Builder(this)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentTitle("Notification")
.SetContentText(body)
.SetAutoCancel(true)
.SetSound(defaultSoundUri)
.SetContentIntent(resultPendingIntent);

var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
}


}

和第二个 Activity 类:

  [Activity(Label = "Notifications")]
public class SecondActivity:Activity
{

protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);

System.Diagnostics.Debug.WriteLine("this worked");
}

}

如前所述,这可以正常工作并接收消息,当您单击它们时,它会加载第二个事件,但是当离开第二个事件页面时,它只会再次重新加载整个应用程序。如果我可以在 PCL 中加载 View 页面(.xaml 或 .xaml.cs)而不是这个会更好。

有什么想法吗?

最佳答案

您可以查看 my post这显示了我是如何做到的,我还打开了一个表单页面。帖子有点长,但基本上有几件事:

  • 我不使用第二个 Activity
  • 我没有将 ClearTop 标志添加到 MainActivity Intent
  • 我不使用 TaskStackBuilder,而是使用 PendingIntent.GetActivity 来获取 PendingIntent
  • 然后我通过将您的 MainActivityLaunchMode 设置为 LaunchMode.SingleTop 来专门解决帖子中的应用重启问题,覆盖 OnNewIntent 在您的 MainActivity 中,然后检查 intent.HasExtras 是否有您在 中设置的特殊 string SendNotification 方法将 Intent 与其他一些 Intent
  • 区分开来

如果您之后还有问题,请告诉我。

编辑:

private void SendNotification(string body)
{
var intent = new Intent(this, typeof(MainActivity));
intent.AddFlags(ActivityFlags.ClearTop);
// var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
intent.PutExtra("SomeSpecialKey", "some special value");

Log.Debug(TAG, "Notification Message Body: " + body);

if (Forms.IsInitialized) { // Ensure XF code has been initialized
// sends notification to view model
MessagingCenter.Send((App)Xamarin.Forms.Application.Current, "Increase");
}

PendingIntent pendingIntent = PendingIntent.GetActivity(Application.Context, 0, intent, PendingIntentFlags.UpdateCurrent | PendingIntentFlags.OneShot);

var defaultSoundUri = RingtoneManager.GetDefaultUri(RingtoneType.Notification);
var notificationBuilder = new NotificationCompat.Builder(this)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentTitle("Notification")
.SetContentText(body)
.SetAutoCancel(true)
.SetSound(defaultSoundUri)
.SetContentIntent(pendingIntent);

var notificationManager = NotificationManager.FromContext(this);
notificationManager.Notify(0, notificationBuilder.Build());
}

然后在MainActivity中:

[Activity(LaunchMode = LaunchMode.SingleTop, ....)]
public class MainActivity : FormsApplicationActivity {

protected override void OnNewIntent(Intent intent) {
if(intent.HasExtra("SomeSpecialKey")) {
System.Diagnostics.Debug.WriteLine("\nIn MainActivity.OnNewIntent() - Intent Extras: " + intent.GetStringExtra("SomeSpecialKey") + "\n");
}

base.OnNewIntent(intent);
}

关于c# - 推送通知上的应用程序重新加载单击 Xamarin Forms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44805445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com