2012-05-14 43 views
3

在我的應用程序中,我創建了一個廣播接收器,它將監聽網絡更改。在OnReceive中,它將檢查設備是否剛剛連接到WiFi,然後開始在後臺上傳。沒有活動會顯示,所以我需要做什麼來初始化框架沒有一個飛濺活動?我不需要框架的任何頁面導航部分,所以精簡的初始化將是最佳的。如何初始化MvvmCross框架而不使用splash活動?

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? 
     } 

回答

5

現在我已經推了一些變化GitHub上應該有希望使您使用其BroadcastReceiver創建您的應用程序。

使用這些修改,你現在可以初始化從任何應用程序組件的核心應用 - 活動,廣播接收器,服務或ContentProvider的 - 使用如下代碼:

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

這些變化應該啓用MvvmCross應用程序在啓動的「Intent.ActionMain」的情況下,以及在情況:

  • 當應用程序清單內的次級意圖是請求
  • 當服務,請求BroadcastReceiver或ContentProvider組件
  • 當因爲Android OS先前已將應用程序清除內存而請求重新啓動時,但用戶現在已請求應用程序返回(有點像WP7中的邏輯刪除後的水合)

一這些變化的更詳盡的解釋是http://slodge.blogspot.co.uk/2012/05/android-application-initialization-and.html

1

UPDATE

我要離開這個答案僅在原地,因爲它是我們談話的良好記錄,以及我們如何來到這個目前的理解。我對方的回答提供了(我希望)的解決方案......


我必須誠實地說,這聽起來並不像這種特殊的應用或部分,你需要描述的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應用程序代碼,並且您可能需要爲您的splashscreen活動使用不同的基類 - 而不是MvxBaseSplashScreenActivity.cs。什麼是重要的是,一些地方在你的應用程序:

  • 創建一個安裝實例
  • 時,需要「正常程序」操作
  • 允許調用該實例上必要的初始化方法
  • 觸發IMvxStartNavigation.Start()廣播接收器在需要此「其他」操作時操作
  • 允許兩種操作位於同一存儲器空間中 - 例如如果在「正常應用」運行時調用廣播接收器會發生什麼情況?

現在又在Android文檔來看,我認爲我們需要改變一點MVX的,以更好地支持此方案在未來的 - 同時也更好地補液情景應對 - 在那裏活動了Android之後再水化相當於墓碑。


我認爲這是註定https://github.com/slodge/MvvmCross/issues/new - 如果你能提供一個簡單的演示應用程序,然後,將是巨大......

+0

同意。如果應用程序中沒有「視圖」(即活動),那麼有一個處理它們的框架有什麼意義? – ctacke

+0

你說得對,我真正追求的是我使用RegisterServiceInstance添加到應用程序中的一些服務。但是,這些服務可能會在框架中使用服務(但不是UI的任何東西)。所以我猜想我正在進行的初始化是爲IoC,跟蹤和可能的GPS獲取框架服務並運行,但不是UI。這可能嗎?謝謝 –

+0

我認爲這是一個我們Droid新手需要小心行事的區域。如果您的廣播接收機與其他活動,服務等共享相同的,那麼我認爲您的廣播接收機可能會與您的活動共享相同的進程/地址空間。如果是這種情況,那麼最好將Android應用程序進行子類化,並將其用作創建Mvvm應用程序基礎結構的位置,而不是使用該工作的啓動畫面活動。 – Stuart