2016-11-24 177 views
0

我從這裏跟着Android Xamarin示例mvvmlight.net。 這兩個活動都擴展了ActivityBase。當我用適當的鍵調用_nav.NavigateTo時,其他活動打開,但每次都調用OnCreate,並且savedInstanceState始終爲空。 OnDestroy()和OnSaveInstanceState()永遠不會被調用。看來NavigateTo創建一個新的活動而不會破壞最後一個。它是否正確?爲什麼MVVM Light的NavigateTo創建新活動而不是重用它們?

在查看Android Activity生命週期時,應只調用一次OnCreate。我怎樣才能恢復其他活動,而不是每次重新創建它?

LoginActivity:

[Activity(Label = "Login", MainLauncher = true, Icon = null)] 
public class LoginActivity : ActivityBase 
{ 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.LoginLayout); 

     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     var nav = new NavigationService(); 

     nav.Configure(Constants.Keys.Main, typeof(MainActivity)); 
     nav.Configure(Constants.Keys.Login, typeof(LoginActivity)); 
     nav.Configure(Constants.Keys.Live, typeof(LiveActivity)); 
     ... 

     SimpleIoc.Default.Register<INavigationService>(() => nav); 

LoginLayout.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="5dp"> 
... some buttons etc 
</LinearLayout> 

MainActivity:

public class MainActivity : ActivityBase 
{ 
    private INavigationService _nav; 
    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.Main); 
     _nav = ServiceLocator.Current.GetInstance<INavigationService>(); 
    } 

    private void Settings_Click(object sender, EventArgs e) 
    { 
     _nav.NavigateTo(Constants.Keys.Settings, null); 
    } 

main.axml:

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:local="http://schemas.android.com/apk/res-auto" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/MainLayout"> 
      <include 
       android:id="@+id/toolbar" 
       layout="@layout/toolbar" /> 
      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:id="@+id/main_content" 
       android:layout_below="@id/toolbar"> 
      <Button 
       android:text="Live" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/buttonLive" 
       android:layout_marginTop="20dp"/> 
      <Button 
       android:text="Alerts" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/buttonAlerts" /> 
      <Button 
       android:text="Settings" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/buttonSettings" /> 
      </LinearLayout> 
     </RelativeLayout> 

回答

0

在每個開始活動意圖上創建一個新活動是默認的Android行爲,這與MVVMLight無關。 如果您想重複使用相同的活動,可以通過配置活動開始意圖來實現。看看Android documentation

對於MVVMLight,它看起來像Android上的默認NavigationService.NavigateTo(string pageKey, object parameter)實現不允許自定義啓動意圖。

如果您想要實現它,您將不得不重新實現您自己的INavigationService支持,以將標記添加到您的意圖intent.AddFlags(ActivityFlags.ClearTop)

+0

GC收集的舊活動也是如此嗎?就我所見,OnDestroy()從不會被調用。我應該如何清理它們? – eirik

+0

我對MVVMLight並不十分熟悉......我希望它不會保留對活動的引用以便收集它們。然後,當本地GC收集它們根據內存壓力不是真正可預測的。 對於開發目的,您可以強制Android在您離開之後立即銷燬活動(它位於開發人員設置中,不要在Nexus 5X中保留活動) – GGirard

相關問題