为什么MVVM Light的NavigateTo创建新活动而不是重用它们?

时间:2016-11-24 10:01:35

标签: android mvvm xamarin mvvm-light light

我从这里mvvmlight.net开始关注Android Xamarin示例。 这两个活动都扩展了ActivityBase。当我用正确的键调用_nav.NavigateTo时,会打开另一个活动,但每次调用OnCreate,且savedInstanceState始终为null。 永远不会调用OnDestroy()和OnSaveInstanceState()。似乎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>

1 个答案:

答案 0 :(得分:0)

在每个启动活动意图上创建一个新活动是默认的Android行为,这与MVVMLight无关。 如果您想重用相同的活动,可以通过配置活动开始意图来实现。看看Android documentation

对于MVVMLight,Android上的默认NavigationService.NavigateTo(string pageKey, object parameter)实现似乎不允许自定义启动意图。

如果你想要实现它,你将不得不重新实现你自己的INavigationService,支持使用intent.AddFlags(ActivityFlags.ClearTop)为你的意图添加标记。