gpt4 book ai didi

xamarin - 如何恢复应用程序并在 Xamarin.forms 中使用推送通知打开特定页面

转载 作者:行者123 更新时间:2023-12-02 17:42:15 27 4
gpt4 key购买 nike

我目前正在开发一个可在 iOS 和 Android 上运行的 Xamarin 应用程序,但我要解释的问题仅涉及 Android 应用程序(这尚未在 iOS 应用程序中实现)。

实际上,当我收到给定的推送通知时,我需要在应用程序中打开特定页面。如果应用程序在收到推送通知时打开,它会很好地工作,但如果我的应用程序关闭或在后台运行,应用程序就会崩溃。

好吧,当我收到通知时,我最终进入了名为“OnShouldOpenCommand”的方法:

  private void OnShouldOpenCommand(string commandId)
{
NotifyNewCommand(AppResources.AppName, AppResources.CommandNotificationText, commandId);

Device.BeginInvokeOnMainThread(() =>
{
try
{

App.MasterDetailPage.Detail = new NavigationPage(new CommandAcceptancePage(commandId))
{
BarBackgroundColor = Color.FromHex("1e1d1d")
};

App.MasterDetailPage.NavigationStack.Push(((NavigationPage)(App.MasterDetailPage.Detail)).CurrentPage);
}
catch(Exception e)
{
Log.Debug("PushAsync", "Unable to push CommandAcceptancePage : "+ex.Message);
}

});
}

private void NotifyNewCommand(string Title,string Description, string commandId)
{
var intent = new Intent(this, typeof(MainActivity));
if (!String.IsNullOrEmpty(commandId))
{
intent.PutExtra("CommandId", commandId);
}
intent.AddFlags(ActivityFlags.ClearTop);
var pendingIntent = PendingIntent.GetActivity(this, 0, intent, 0);

var notificationBuilder = new Notification.Builder(this)
.SetSmallIcon(Resource.Drawable.icon)
.SetContentTitle("Kluox")
.SetContentText(Description)
.SetAutoCancel(true)
.SetContentIntent(pendingIntent);

Notification notification = notificationBuilder.Build();

var notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
notificationManager.Notify(0, notification);
}

和代码

App.MasterDetailPage.Detail = new NavigationPage(new CommandAcceptancePage(commandId))
{
BarBackgroundColor = Color.FromHex("1e1d1d")
};

正在生成类型的异常:

Java.Lang.IllegalStateException: Can not perform this action after onSaveInstanceState

那么,如果我的应用程序没有在前台运行,我想我无法访问“App”并重定向到另一个页面。嗯,这是我收到推送通知的时候,而不是我点击它的时候。但是,我不打算通过这样做来重新打开我的应用程序。

因为之后,当我点击名为 Kluox 的推送通知(这应该重新打开我的应用程序)时,应用程序崩溃了,我真的不知道为什么,我不知道在哪里放置断点能够调试,因为 Visual Studio 只是告诉我“发生了未处理的异常。”。

enter image description here

有人可以帮助我吗?如果您需要任何代码,您可以问我,我会编辑我的消息并为您提供您需要的任何信息!

编辑 1:这是我的 OnCreate 方法的代码:

protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;

base.OnCreate(bundle);
var info = Intent.Extras?.GetString("CommandId", "");
global::Xamarin.Forms.Forms.Init(this, bundle);
if (String.IsNullOrEmpty(info))
{
LoadApplication(new App());
}
else
{
LoadApplication(new App(info));
}
if (instance == null)
{
instance = this;
RegisterWithGCM();
}
else
{
instance = this;
}
}

最佳答案

重写了MainActivity的所有方法后,我终于找到了崩溃的原因:OnDestroy方法被调用了两次,并且抛出了IllegalStateException,因为activity已经被销毁了。我找到了这个解决方法:

 protected override void OnDestroy()
{
try
{
base.OnDestroy();
}
catch (Java.Lang.IllegalStateException ex)
{
Log.Debug("MainActivity.OnDestroy", ex, "The activity was destroyed twice");
}

}

并且异常被简单地记录下来,应用程序可以毫无问题地打开和使用。

当重定向也起作用时,我将编辑此答案。

编辑:如何重定向到页面

首先,我们需要在构造函数中注册 MessagingCenter

public static MyPackage.Model.Command CurrentCommand { get; set; }
public App()
{
InitializeComponent();
MainPage = new ContentPage();
MessagingCenter.Subscribe<object, DataLib.Model.Command>(this, "Command", (sender, arg) => {
try
{
CurrentCommand = arg;
}
catch(Exception ex)
{
CurrentCommand = null;
}
});
}

并在收到推送通知时发送消息:

private void OnMessage(string serializedCommand)
{
//stuff happens
MessagingCenter.Send<object, MyPackage.Model.Command>(this, "Command", command);
}

最后,当我们得到App.Xaml.cs的OnStart()时

                if (CurrentCommand != null)
{
App.MasterDetailPage.Detail = new NavigationPage(new CommandAcceptancePage(CurrentCommand, service))
{
BarBackgroundColor = Color.FromHex("1e1d1d")
};
}

目前看来,它已经成功了!随后将进行更多调试,但代码似乎可以工作。非常感谢@BraveHeart 的帮助!

关于xamarin - 如何恢复应用程序并在 Xamarin.forms 中使用推送通知打开特定页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42956568/

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