2016-11-24 9 views
0

나는 여기 mvvmlight.net에서 Android Xamarin 예제를 따라 갔다. 두 작업 모두 ActivityBase를 확장합니다. 적절한 키를 사용하여 _nav.NavigateTo를 호출하면 다른 활동이 열리지 만 OnCreate는 매번 호출되며 savedInstanceState는 항상 null입니다. OnDestroy() 및 OnSaveInstanceState()는 호출되지 않습니다. NavigateTo가 마지막 활동을 파괴하지 않고 새로운 활동을 생성하는 것 같습니다. 이 올바른지?MVVM Light의 NavigateTo가 새 활동을 재사용하지 않고 만드는 이유는 무엇입니까?

Android 활동주기를 살펴볼 때 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) 구현에서 시작 인 텐트를 사용자 정의 할 수 없습니다.

달성하고자하는 경우 intent.AddFlags(ActivityFlags.ClearTop)으로 의도에 플래그를 추가하는 것을 지원하는 자체 INavigationService를 다시 구현해야합니다.

+0

GC에서 수집 한 이전 활동이 있습니까? OnDestroy()는 내가 볼 수있는 한 호출되지 않습니다. 어떻게 청소해야합니까? – eirik

+0

나는 MVVMLight에 익숙하지 않다 ... 나는 그것들을 수집 할 수 있도록하기 위해 활동에 대한 참조를 유지하지 않을 것을 기대한다. 그런 다음 기본 GC가 수집 할 때 메모리 압력에 따라 실제로 예측할 수는 없습니다. 개발자 목적으로 Android를 떠나려면 Android를 강제 종료 할 수 있습니다 (개발자 설정에서 Nexus 5X에서 '활동 계속하지 않음'). – GGirard