我从这里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>
答案 0 :(得分:0)
在每个启动活动意图上创建一个新活动是默认的Android行为,这与MVVMLight无关。 如果您想重用相同的活动,可以通过配置活动开始意图来实现。看看Android documentation。
对于MVVMLight,Android上的默认NavigationService.NavigateTo(string pageKey, object parameter)实现似乎不允许自定义启动意图。
如果你想要实现它,你将不得不重新实现你自己的INavigationService,支持使用intent.AddFlags(ActivityFlags.ClearTop)
为你的意图添加标记。