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 OS が以前にアプリをメモリから消去したために再起動が要求されたが、ユーザーがアプリを再び要求した場合 (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を気にせずに自分で初期化できますか、それともあなたが探しているものが他にありますか?


最小限のフレームワークを起動したい場合は、 https: //github.com/slodge/MvvmCross/tree/master/Sample%20-%20SimpleDialogBinding/SimpleBindingなどのSimpleBindingの例を確認することもできます。 / SimpleDroid

これらの「シンプルな」アプリは、完全な「アプリケーション」を作成しないMvxSimpleAndroidBindingSetupセットアップルーチンを使用します。これがまさにあなたが探しているものかどうかはわかりませんか?

これらのタイプのアプリで発生する可能性のある問題の1つは、アパートのスレッド方式で使用されることを期待するコードを使用する場合です。ViewおよびViewModel対応のコードの構築を開始するときに、コードの一部がそこで使用することを期待することは珍しくありません。利用可能なUIスレッドであること。これを回避できるはずですが、コードを設計およびデバッグするときは注意してください。


別の方法として、MonoDroidプロジェクト内でAndroid.App.Applicationをサブクラス化することを検討してください-http ://developer.android.com/reference/android/app/Application.html

このAndroidアプリケーションは、セットアップの最初のステージをその中でキックオフできますOnCreate-これは、ブロードキャストレシーバーが機能するために必要な最小値である必要があります-変​​更されたSplashActivityは、2番目のステージをキックオフできます-アプリ全体に必要な残りのコード働くために。

Setup.csMvxApplication Appコードを調整する必要があり、 MvxBaseSplashScreenActivity.csの代わりにスプラッシュスクリーンアクティビティに別の基本クラスを使用する必要がある場合があります。重要なのは、アプリのどこかにあることです。

  • セットアップインスタンスを作成します
  • そのインスタンスで必要なInitializeメソッドを呼び出します
  • IMvxStartNavigation.Start()「通常のアプリ」操作が必要な場合にトリガーします
  • この「その他の」操作が必要な場合に放送受信機を操作できるようにします
  • 両方の操作を同じメモリスペースに配置できます。たとえば、「通常のアプリ」の実行中にブロードキャストレシーバーが呼び出された場合はどうなりますか?

Androidのドキュメントをもう一度見てみると、将来このシナリオをより適切にサポートするために、また、Androidに相当する墓石の後にアクティビティが再水和される再水和シナリオに対処するために、mvxを少し変更する必要があると思います。


これはhttps://github.com/slodge/MvvmCross/issues/newに向けられていると思います-簡単なデモアプリを提供できれば、それは素晴らしいことです...

于 2012-05-14T14:41:49.653 に答える