我目前正在开发一个适用于iOS和Android的Xamarin应用程序,但我将要解释的问题仅涉及Android应用程序(这在iOS应用程序中尚未实现)。
实际上,当我接收到给定的推送通知时,需要打开应用程序中的特定页面。如果应用程序在接收到推送通知时处于打开状态,则非常有效,但是如果我的应用程序关闭或在后台运行,则应用程序会崩溃。
如此,当我接收到通知时,我最终进入了名为"OnShouldOpenCommand"的方法:
实际上,当我接收到给定的推送通知时,需要打开应用程序中的特定页面。如果应用程序在接收到推送通知时处于打开状态,则非常有效,但是如果我的应用程序关闭或在后台运行,则应用程序会崩溃。
如此,当我接收到通知时,我最终进入了名为"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:在保存实例状态之后无法执行此操作
所以我想,如果我的应用程序没有运行在前台,我就不能访问“App”并重定向到另一个页面。好吧,这就是当我收到推送通知而不是点击它时发生的情况。但是,我不打算通过这种方式重新打开我的应用程序。
因为在那之后,当我点击名为Kluox的推送通知时(这应该重新打开我的应用程序),应用程序会崩溃,我真的不知道为什么,我不知道在哪里设置断点以便进行调试,因为 Visual Studio 只告诉我“发生了未处理的异常”。
有人可以帮我吗?如果您需要任何代码片段,您只需问我,我将编辑我的消息并提供您所需的任何信息!
编辑 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;
}
}