Xamarin.forms 应调用OnResume()时调用App.xaml.cs ctor

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

如果我在应用程序中导航并使用HomeButton返回Android启动屏幕,则会调用OnSleep()钩子,这很好。如果我使用Android TaskManager返回应用程序,将调用OnResume()。 如果我使用Hardware BackButton在我的应用程序中导航,那么也会调用OnSleep(),这很好,但是如果我导航回我的应用程序,则会调用MainActivity中的OnCreate方法,该方法会重新创建应用程序

        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
使用Android
TaskManager
打开应用程序时:

[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