3

在我的应用程序中,我正在创建一个广播接收器,它将监听网络变化。在 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?
        }
4

2 回答 2

7

我现在已经向 GitHub 推送了一些更改,希望这些更改能够让您使用其 BroadcastReceiver 创建您的应用程序。

使用这些修改,您现在可以使用以下代码从任何应用程序组件(Activity、BroadcastReceiver、Service 或 ContentProvider)初始化核心应用程序:

var setup = MvxAndroidSetupSingleton.GetOrCreateSetup(this.ApplicationContext);
setup.EnsureInitialized(this.GetType());

这些更改应该使 MvvmCross 应用程序能够在“Intent.ActionMain”场景以及以下情况下启动:

  • 当应用程序清单中的辅助意图是请求时
  • 当请求 Service、BroadcastReceiver 或 ContentProvider 组件时
  • 当请求重新启动时,因为 Android 操作系统之前已将应用程序从内存中清除,但用户现在已请求重新启动应用程序(有点像 WP7 中墓碑后的水合作用)

这些变化的更详细的解释是http://slodge.blogspot.co.uk/2012/05/android-application-initialization-and.html

于 2012-05-16T19:21:54.693 回答
1

更新

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


老实说,听起来你描述的这个特定应用程序或部分不需要 MVVM 框架?

我觉得这可能被构建为“原始 MonoDroid”?也许您甚至可以将其作为 Android 服务来实现?

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


如果您确实想要启动一个最小的框架,那么一个选择可能是查看 SimpleBinding 示例 - 例如https://github.com/slodge/MvvmCross/tree/master/Sample%20-%20SimpleDialogBinding/SimpleBinding /SimpleDroid

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

在这些类型的应用程序中您可能会发现的一个问题是,如果您使用任何期望以单元线程方式使用的代码 - 当您开始构建 View 和 ViewModel 感知代码时,一些代码期望在那里并不少见成为可用的 UI 线程。您应该能够解决这个问题 - 但在设计和调试代码时要注意它。


作为另一种选择,考虑在您的 MonoDroid 项目中子类化 Android.App.Application - http://developer.android.com/reference/android/app/Application.html

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

您可能会发现您需要调整您Setup.cs和您的 MvxApplication 应用程序代码,并且您可能需要为您的闪屏 Activity 使用不同的基类 - 而不是MvxBaseSplashScreenActivity.cs。重要的是您的应用程序中的某处:

  • 创建一个 Setup 实例
  • 在该实例上调用必要的 Initialize 方法
  • IMvxStartNavigation.Start()当需要“正常应用”操作时触发
  • 允许广播接收器在需要此“其他”操作时进行操作
  • 允许两个操作位于相同的内存空间中 - 例如,如果在“普通应用程序”运行时调用广播接收器会发生什么?

现在再次查看 Android 文档,我认为我们需要更改一些 mvx 以在未来更好地支持这种情况 - 并更好地应对再水化场景 - 在 android 相当于墓碑之后对活动进行再水化。


我认为这注定是为了https://github.com/slodge/MvvmCross/issues/new - 如果你能提供一个简单的演示应用程序,那就太好了......

于 2012-05-14T14:41:49.653 回答