C# 如何在没有启动活动的情况下初始化MvvmCross框架?

C# 如何在没有启动活动的情况下初始化MvvmCross框架?,c#,xamarin.android,mvvmcross,C#,Xamarin.android,Mvvmcross,在我的应用程序中,我正在创建一个广播接收器,用于监听网络变化。在OnReceive中,它将检查设备是否刚刚连接到WiFi,然后在后台开始上传。不会显示任何活动,那么在没有启动活动的情况下,我需要如何初始化框架?我不需要框架的任何页面导航部分,因此精简的初始化将是最佳选择 private override void OnReceive(Context context, Intent intent) { bool isWifiConnected = false;

在我的应用程序中,我正在创建一个广播接收器,用于监听网络变化。在OnReceive中,它将检查设备是否刚刚连接到WiFi,然后在后台开始上传。不会显示任何活动,那么在没有启动活动的情况下,我需要如何初始化框架?我不需要框架的任何页面导航部分,因此精简的初始化将是最佳选择

    private override void OnReceive(Context context, Intent intent)
    {
        bool isWifiConnected = false;
        bool isMobileConnected = false;

        if (intent.Action.Equals(ConnectivityManager.ConnectivityAction))
        {
            NetworkInfo networkInfo = (NetworkInfo)intent.GetParcelableExtra(ConnectivityManager.ExtraNetworkInfo);


            if (networkInfo.IsConnected)
            {
                if (networkInfo.Type == (int)ConnectivityType.Wifi)
                {
                    isWifiConnected = true;
                }
                if (networkInfo.Type == (int)ConnectivityType.Mobile)
                {
                    isMobileConnected = true;
                }
            }
        }

        if (isWifiConnected)
        {
            StartUp(); //What do I put in this private method?
        }

更新

我留下这个答案只是因为它记录了我们的谈话以及我们是如何达成这一共识的。我的另一个答案(我希望)提供了一个解决方案


我必须诚实地说,它听起来不像你描述的这个特定的应用程序或部分需要一个MVVM框架

我觉得这可能是一个“原始单机器人”?也许你甚至可以作为一个Android服务来做这件事

在这种情况下,您希望从框架中得到什么? -例如,它只是一个IoC容器吗?在这种情况下,您可以自己初始化,而不用担心MVM 或者你还在寻找什么


如果您确实希望启动一个最小的框架,那么一个选择可能是查看SimpleBinding示例,如

这些“简单”的应用程序使用的是MvxSimpleAndroidBindingSetup例程,它不会创建完整的“应用程序”-我不确定这是否正是您想要的

在这些类型的应用程序中,您可能会发现一个问题,即如果您使用任何预期以单元线程方式使用的代码,那么当您开始构建视图和视图模型感知代码时,一些代码期望有一个可用的UI线程是很正常的。您应该能够解决这个问题,但在设计和调试代码时要注意这一点


作为另一种选择,请考虑您的单项工程中的子类ANDROID.APP应用程序

这个Android应用程序可以在其
OnCreate
中启动第一阶段的设置-这应该是广播接收器工作所需的最低要求-修改后的SplashActivity可以启动第二阶段-整个应用程序工作所需的其余代码

您可能会发现您需要调整
Setup.cs
和MvxApplication应用程序代码,并且您可能需要为splashscreen活动使用不同的基类,而不是。重要的是,你的应用程序中的某些地方:

  • 创建一个安装实例
  • 在该实例上调用必要的初始化方法
  • 当需要“正常应用程序”操作时,触发
    IMvxStartNavigation.Start()
  • 允许广播接收器在需要此“其他”操作时运行
  • 允许两个操作位于同一内存空间中-例如,如果在“正常应用程序”运行时调用广播接收器,会发生什么情况
现在再看一遍Android文档,我认为我们需要对mvx进行一些更改,以便在将来更好地支持这种场景,同时更好地应对补液场景,即在Android相当于墓碑之后对活动进行补液



我认为这是注定的-如果你能提供一个简单的演示应用程序,那就太好了…

我现在对GitHub做了一些更改,希望你能用它的广播接收器创建你的应用程序

使用这些修改,您现在可以使用以下代码从任何应用程序组件(活动、广播接收器、服务或内容提供者)初始化核心应用程序:

var setup = MvxAndroidSetupSingleton.GetOrCreateSetup(this.ApplicationContext);
setup.EnsureInitialized(this.GetType());
这些更改应使MvvmCross应用程序能够在“Intent.ActionMain”场景中以及以下情况下启动:

  • 当应用程序清单中的次要目的是请求时
  • 请求服务、BroadcastReceiver或ContentProvider组件时
  • 当由于Android操作系统先前已将应用程序从内存中清除而请求重新启动时,但用户现在已请求重新启动应用程序(有点类似于WP7中的逻辑删除)


同意对这些变化进行更详细的解释。如果应用程序中没有“视图”(即活动),那么有一个框架来处理它们有什么意义呢?没错,我真正想要的是我使用RegisterServiceInstance添加到应用程序中的一些服务。但是,这些服务可以使用框架中的服务(但不使用任何UI内容)。所以我想我想要的初始化是为IoC启动并运行框架服务,跟踪和可能的GPS,但不是UI。这可能吗?谢谢,我认为这是一个我们机器人新手需要小心处理的领域。如果您的广播接收器与其他活动、服务等共享相同的内容,那么我认为您的广播接收器可能与您的活动共享相同的进程/地址空间。如果是这种情况,那么最好对Android应用程序进行子类化,并将其用作创建Mvvm应用程序基础结构的地方,而不是使用splashscreen活动来完成该工作。你在这里“踩在了白雪上”。。。但我认为这个框架可以解决这个问题。最好先在演示应用程序和接收器中解决这个问题-例如,做一个快速的独立原型,这样你就可以在不破坏“真实”代码的情况下犯很多错误并从中吸取教训:)好的,谢谢你的提示,我会有一个剧本,然后在这里或