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