Xamarin.forms 应调用OnResume()时调用App.xaml.cs ctor
如果我在应用程序中导航并使用HomeButton返回Android启动屏幕,则会调用OnSleep()钩子,这很好。如果我使用Android TaskManager返回应用程序,将调用OnResume()。 如果我使用Hardware BackButton在我的应用程序中导航,那么也会调用OnSleep(),这很好,但是如果我导航回我的应用程序,则会调用MainActivity中的OnCreate方法,该方法会重新创建应用程序Xamarin.forms 应调用OnResume()时调用App.xaml.cs ctor,xamarin.forms,xamarin.android,Xamarin.forms,Xamarin.android,如果我在应用程序中导航并使用HomeButton返回Android启动屏幕,则会调用OnSleep()钩子,这很好。如果我使用Android TaskManager返回应用程序,将调用OnResume()。 如果我使用Hardware BackButton在我的应用程序中导航,那么也会调用OnSleep(),这很好,但是如果我导航回我的应用程序,则会调用MainActivity中的OnCreate方法,该方法会重新创建应用程序 global::Xamarin.Forms.Form
global::Xamarin.Forms.Forms.Init (this, bundle);
DisplayCrashReport();
LoadApplication (new Gtue.Mobile.App ());
这不应该发生。在App.xaml的ctor中,我初始化了只应该初始化一次的东西。我尝试了每一种启动模式来进行维护,但没有任何效果
有没有办法确定应用程序是否已经初始化?您的
应用程序
类扩展自Xamarin.Forms.Application
和Xamarin.Forms.Application
生命周期与活动
生命周期绑定。您可以在以下目录中找到:
所以你只需要关心你的活动
的生命周期。当您触摸home按钮时,应用程序不会从任务堆栈中删除MainActivity
,当您重新进入应用程序时,MainActivity
将可用,因此它不会执行OnCreate
方法
当您触摸主页按钮时
:
[0:] MainActivity OnPause
[0:] MainActivity OnStop
[0:] Forms App OnSleep
使用AndroidTaskManager
打开应用程序时:
[0:] MainActivity OnRestart
[0:] Forms App OnResume
[0:] MainActivity OnResume
但当您触摸硬件BackButton
时,main活动将从任务堆栈中删除:
[0:] MainActivity OnPause
[0:] MainActivity OnStop
[0:] Forms App OnSleep
[0:] MainActivity OnDestroy
当main活动
被销毁时,您的应用程序将处理资源,包括您的Gtue.Mobile.App
实例。你可以看到:
因此,下次打开应用程序时,有必要重新创建App
类。实际上,App
只初始化了一次。我在观察我的App.xaml.cs构造函数时遇到了这个问题,当时我正在安卓设备上按home按钮,然后单击我的App
上面详细的回答详细说明了正确的“预期行为”,但对我来说,情况并非如此
当我使用home(主页)按钮或back(返回)按钮时,我得到了这种流量-
**On Debug Start**
MainActivity:OnCreate
XF:AppCtor
XF:OnStart
MainActivity:OnResume
**Press Home Button**
MainActivity:OnPause
XF:OnSleep
**Launch App via Click on App Icon**
MainActivity:OnCreate
XF:AppCtor
搜索最终让我找到了-
这反过来又导致在MainActivity OnCreate的顶部出现以下Xamarin代码-
if (!IsTaskRoot)
{
string action = Intent.Action;
if (Intent.HasCategory(Android.Content.Intent.CategoryLauncher) &&
!string.IsNullOrEmpty(Intent.Action) &&
action == Android.Content.Intent.ActionMain)
{
Finish();
return;
}
}
这似乎至少解决了初始重新加载问题
我还将此与-
LaunchMode = LaunchMode.SingleTask
在通知屏幕中单击通知时停止一些双重活动的恶作剧
if (!IsTaskRoot)
{
string action = Intent.Action;
if (Intent.HasCategory(Android.Content.Intent.CategoryLauncher) &&
!string.IsNullOrEmpty(Intent.Action) &&
action == Android.Content.Intent.ActionMain)
{
Finish();
return;
}
}
LaunchMode = LaunchMode.SingleTask