2016-11-24 11 views
0

J'ai suivi l'exemple Android Xamarin d'ici mvvmlight.net. Les deux activités étendent ActivityBase. Lorsque j'appelle _nav.NavigateTo avec les clés correctes, l'autre activité est ouverte, mais OnCreate est appelé à chaque fois, et savedInstanceState est toujours null. OnDestroy() et OnSaveInstanceState() ne sont jamais appelés. Il semble que NavigateTo crée une nouvelle activité sans détruire le dernier. Est-ce correct? Lorsque vous consultez le cycle de vie de l'activité Android, vous ne devez appeler OnCreate qu'une seule fois. Comment puis-je simplement reprendre l'autre activité au lieu de la recréer à chaque fois?Pourquoi NavigateTo de MVVM Light crée-t-il de nouvelles activités au lieu de les réutiliser?

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> 

Répondre

0

La création d'une nouvelle activité à chaque démarrage de l'activité est le comportement par défaut d'Android, ce qui n'est en aucun cas lié à MVVMLight. Si vous souhaitez réutiliser la même activité, vous pouvez l'atteindre en configurant votre intention de démarrage de l'activité. Jetez un oeil à la Android documentation.

Dans le cas de MVVMLight, il semble que l'implémentation NavigationService.NavigateTo(string pageKey, object parameter) par défaut sur Android ne permet pas de personnaliser l'intention de démarrage.

Si vous souhaitez le réaliser, vous devrez réimplémenter votre propre service INavigationService pour ajouter le drapeau à votre intention avec intent.AddFlags(ActivityFlags.ClearTop).

+0

Les anciennes activités sont-elles collectées par GC? OnDestroy() n'est jamais appelé aussi loin que je peux voir. Comment suis-je censé les nettoyer? – eirik

+0

Je ne suis pas vraiment familier avec MVVMLight ... Je m'attends à ce qu'il ne garde pas de références aux activités afin de permettre leur collecte. Ensuite, lorsque le GC natif va les recueillir n'est pas vraiment prévisible en fonction de la pression de la mémoire. Pour le but de dev, vous pouvez forcer Android à détruire les activités dès que vous en laissez un (c'est dans les paramètres du développeur, "Ne pas garder les activités" dans un Nexus 5X) – GGirard