当前位置: 首页 > 知识库问答 >
问题:

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

西门建安
2023-03-14

如果我在我的应用程序中导航并使用HomeButton返回Android LaunchScreen,则会调用OnSpt()挂钩,这很好。如果我使用Android TaskManager导航回应用程序,则会调用OnResume()。如果我使用Hardware BackButton在我的应用程序中导航,那么也会调用OnSpt(),这很好,但如果我导航回我的应用程序,则会调用Mainactive中的OnCreate方法,从而重新创建应用程序。

        global::Xamarin.Forms.Forms.Init (this, bundle);
        DisplayCrashReport();
        LoadApplication (new Gtue.Mobile.App ());

这不应该发生。在App.xaml的ctor中,我初始化了只需要初始化一次的东西。我试了每一种启动方式,都没用。

有没有办法找出应用程序是否已经初始化?

共有2个答案

万高轩
2023-03-14

我在观察App.xaml时遇到了这个问题。当我按下Android设备上的主页按钮,然后单击我的应用程序时,cs构造器被调用。

上面详细的回答详细说明了正确的“预期行为”,但我的情况并非如此。

当我使用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

搜寻最终让我找到了-

应用重启而不是继续

这反过来又导致以下 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

当点击通知屏幕中的通知时,停止一些双重活动诡计。

何承
2023-03-14

您的< code>App类从< code>Xamarin扩展而来。Forms.Application和< code>Xamarin。Forms.Application生命周期与< code>Activity生命周期绑定在一起。您可以在源代码中找到它:

async Task OnStateChanged()
{
    if (_application == null)
        return;

    if (_previousState == AndroidApplicationLifecycleState.OnCreate && _currentState == AndroidApplicationLifecycleState.OnStart)
        _application.SendStart();
    else if (_previousState == AndroidApplicationLifecycleState.OnStop && _currentState == AndroidApplicationLifecycleState.OnRestart)
        _application.SendResume();
    else if (_previousState == AndroidApplicationLifecycleState.OnPause && _currentState == AndroidApplicationLifecycleState.OnStop)
        await _application.SendSleepAsync();
}

因此,您只需要关心活动的生命周期即可。当您触摸 HomeButton 时,应用程序不会从任务堆栈中删除 MainActivity,当您重新进入应用程序时,MainActivity 将可用,因此它没有执行 OnCreate 方法。

当您触摸主页按钮时

[0:] MainActivity OnPause
[0:] MainActivity OnStop
[0:] Forms App OnSleep

当您使用Android<code>TaskManager<code>打开应用程序时:

[0:] MainActivity OnRestart
[0:] Forms App OnResume
[0:] MainActivity OnResume

但是,当您触摸硬件后退按钮时,MainActivity将从任务的堆栈中删除:

[0:] MainActivity OnPause
[0:] MainActivity OnStop
[0:] Forms App OnSleep
[0:] MainActivity OnDestroy

当< code>MainActivity被销毁时,您的应用程序将释放资源,包括您的< code>Gtue。Mobile.App实例。你可以看到OnDestroy()方法的源代码:

protected override void OnDestroy()
{
    PopupManager.Unsubscribe(this);
    _platform?.Dispose();

    // call at the end to avoid race conditions with Platform dispose
    base.OnDestroy();
}

因此,下次打开应用程序时,必须重新创建 App 类。实际上,该应用程序只初始化了一次。

 类似资料:
  • 我使用带有ViewPager的FragmentPagerAdapter来切换片段 那么我如何使片段调用它们的onResume()呢?

  • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit

  • 假设有两个Fragments,X和Y。我在X上添加Y片段。当Y完成它的工作,然后删除,X再次可见。 问题:当Y片段被删除并且X再次可见时,我必须执行一些任务,但不会调用,因为它取决于活动。那么我怎么知道片段是可见的呢?

  • 我在一个activity里有多个碎片。在一个按钮点击我开始一个新的片断,将它添加到backstack。我自然希望调用当前片段的方法和新片段的。但这并没有发生。 我所期待的是, 单击按钮时,LoginFragment将被替换为HomeFragment、LoginFragment的以及HomeFragment的将被调用 按下“上一步”时,将弹出HomeFragment并看到LoginFragment,

  • 我正在使用开发一个应用程序。 这是我的活动: 我使用的FragmentStatePagerAdapter如下所示: }

  • 在我的应用程序中,其中一个活动有两个。我从建议列表中选择它们的值,然后按 OK 按钮。“确定”按钮为我带来了一个新活动,用于显示“自动完成”文本视图值的结果基础。但是,如果我现在按下后退按钮并返回到具有两个自动完成TextView文本视图的活动,它们都开始显示建议列表。我希望他们不要显示建议列表,因为建议列表只包含文本视图中已有的单个项目。我试图设置适配器空值,然后设置回原始数组,但这并不能阻止自