2014-12-19 3 views
2

Я пытаюсь реализовать быстрое возобновление приложения для Windows Phone 8. Я следовал the link at MSDN.Быстрое приложение Резюме не работает

А вот код в XAML:

<Tasks> 
    <DefaultTask Name="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume"/> 
</Tasks> 

И это код в App.xaml.cs

public static PhoneApplicationFrame RootFrame { get; private set; } 
    bool wasRelaunched = false;  
    bool mustClearPagestack = false;  
    IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; 

    enum SessionType 
    { 
     None, 
     Home, 
     DeepLink 
    } 

    private SessionType sessionType = SessionType.None; 

    public App() 
    {   
     UnhandledException += Application_UnhandledException;   
     InitializeComponent();   
     InitializePhoneApplication();   
     InitializeLanguage();  
     if (Debugger.IsAttached) 
     {    
      Application.Current.Host.Settings.EnableFrameRateCounter =true; 
      PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; 
     } 
    } 

    private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
     RemoveCurrentDeactivationSettings(); 
    } 

    private void Application_Activated(object sender, ActivatedEventArgs e) 
    { 

     mustClearPagestack = CheckDeactivationTimeStamp(); 

     if (!e.IsApplicationInstancePreserved) 
     { 
      RestoreSessionType(); 
     } 
    } 

    private void Application_Deactivated(object sender, DeactivatedEventArgs e) 
    { 
     SaveCurrentDeactivationSettings(); 
    } 

    private void Application_Closing(object sender, ClosingEventArgs e) 
    { 
     RemoveCurrentDeactivationSettings(); 
    } 

    private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) 
    { 
     if (Debugger.IsAttached) 
     { 

      Debugger.Break(); 
     } 
    } 

    private void Application_UnhandledException(object sender,ApplicationUnhandledExceptionEventArgs e) 
    { 
     if (Debugger.IsAttached) 
     { 

      Debugger.Break(); 
     } 
    } 

    private bool phoneApplicationInitialized = false; 

    private void InitializePhoneApplication() 
    { 
     if (phoneApplicationInitialized) 
      return; 


     RootFrame= new PhoneApplicationFrame(); 

     RootFrame.Background = new SolidColorBrush(Color.FromArgb(255, 27, 200, 174)); 
     RootFrame.Navigated += CompleteInitializePhoneApplication; 


     RootFrame.NavigationFailed += RootFrame_NavigationFailed; 


     RootFrame.Navigated += CheckForResetNavigation; 
     RootFrame.Navigating += RootFrame_Navigating; 


     phoneApplicationInitialized = true; 
    } 

    void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) 
    { 
     if (e.Uri.ToString().Contains(@"/MainPage.xaml") == true && !AppPrefManager.Instance.IsFastAppResumeEnabled) 
     { 
      RootFrame.Dispatcher.BeginInvoke(delegate 
      { 
       if (!AppPrefManager.Instance.IsVirginLaunchCompleted) 
       { 
        RootFrame.Navigate(new Uri(Constants.kIntroPage, UriKind.Relative)); 
       } 
       else 
       { 
        RootFrame.Navigate(new Uri(Constants.kMainPage, UriKind.Relative)); 
       } 
      }); 
      e.Cancel = true; 
     } 


     if (sessionType == SessionType.None && e.NavigationMode == NavigationMode.New) 
     { 

      if (e.Uri.ToString().Contains("DeepLink=true")) 
      { 
       sessionType = SessionType.DeepLink; 
      } 
      else if (e.Uri.ToString().Contains("/MainPage.xaml")) 
      { 
       sessionType = SessionType.Home; 
      } 
     } 


     if (e.NavigationMode == NavigationMode.Reset) 
     { 

      wasRelaunched = true; 
     } 
     else if (e.NavigationMode == NavigationMode.New && wasRelaunched) 
     { 

      wasRelaunched = false; 

      if (e.Uri.ToString().Contains("DeepLink=true")) 
      { 


       sessionType = SessionType.DeepLink; 

      } 
      else if (e.Uri.ToString().Contains("/MainPage.xaml")) 
      { 

       if (sessionType == SessionType.DeepLink) 
       { 

        sessionType = SessionType.Home; 
       } 
       else 
       { 
        if (!mustClearPagestack) 
        { 

         e.Cancel = true; 
         RootFrame.Navigated -= ClearBackStackAfterReset; 
        } 
       } 
      } 

      mustClearPagestack = false; 
     } 
    } 

    private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) 
    { 

     if (RootVisual != RootFrame) 
      RootVisual = RootFrame; 

     RootFrame.Navigated -= CompleteInitializePhoneApplication; 
    } 

    private void CheckForResetNavigation(object sender, NavigationEventArgs e) 
    { 

     if (e.NavigationMode == NavigationMode.Reset) 
      RootFrame.Navigated += ClearBackStackAfterReset; 
    } 

    private void ClearBackStackAfterReset(object sender, NavigationEventArgs e) 
    { 

     RootFrame.Navigated -= ClearBackStackAfterReset; 


     if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh) 
      return; 


     while (RootFrame.RemoveBackEntry() != null) 
     { 
      ; 
     } 
    } 

    private void InitializeLanguage() 
    { 
     try 
     { 
      FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); 
      RootFrame.FlowDirection = flow; 
     } 
     catch 
     { 
      if (Debugger.IsAttached) 
      { 
       Debugger.Break(); 
      } 

      throw; 
     } 
    } 

    bool CheckDeactivationTimeStamp() 
    { 
     DateTimeOffset lastDeactivated; 

     if (settings.Contains("DeactivateTime")) 
     { 
      lastDeactivated = (DateTimeOffset)settings["DeactivateTime"]; 
     } 

     var currentDuration = DateTimeOffset.Now.Subtract(lastDeactivated); 

     return TimeSpan.FromSeconds(currentDuration.TotalSeconds) > TimeSpan.FromSeconds(30); 
    } 

    public bool AddOrUpdateValue(string Key, Object value) 
    { 
     bool valueChanged = false; 


     if (settings.Contains(Key)) 
     { 

      if (settings[Key] != value) 
      { 

       settings[Key] = value; 
       valueChanged = true; 
      } 
     } 

     else 
     { 
      settings.Add(Key, value); 
      valueChanged = true; 
     } 
     return valueChanged; 
    } 

    public void RemoveValue(string Key) 
    { 

     if (settings.Contains(Key)) 
     { 
      settings.Remove(Key); 
     } 
    } 

    public void SaveCurrentDeactivationSettings() 
    { 
     if (AddOrUpdateValue("DeactivateTime", DateTimeOffset.Now)) 
     { 
      settings.Save(); 
     } 

     if (AddOrUpdateValue("SessionType", sessionType)) 
     { 
      settings.Save(); 
     } 

    } 

    public void RemoveCurrentDeactivationSettings() 
    { 
     RemoveValue("DeactivateTime"); 
     RemoveValue("SessionType"); 
     settings.Save(); 
    } 

    void RestoreSessionType() 
    { 
     if (settings.Contains("SessionType")) 
     { 
      sessionType = (SessionType)settings["SessionType"]; 
     } 
    } 

Предположим, в то время как я нахожусь в ThirdPage. Я нажимаю кнопку Windows. И затем я нажимаю значок приложения на начальном экране. Вместо того, чтобы приложение возобновлялось из ThirdPage. Сначала он показывает ThirdPage, а затем начинается с MainPage.

ответ

1

По умолчанию приложение по-прежнему перемещается на страницу по умолчанию, когда приложение запускается с помощью плейлирования приложения. Вы можете проверить тип сеанса в методах RootFrame_Navigated и отменить эту навигацию, если хотите.

Шаблон по умолчанию добавляет метод CheckNavigation к в App.xaml.cs, что очищает backstack после навигации с NavigationMode Сброс.

Вы можете проверить его, если ваше приложение должно оставаться на последней странице или лучше сбросить настройки и начать все заново.

Образец для обработки различных типов активации можно найти здесь: MSDN Fast Resume Sample, App.xaml.cs

(Метод: RootFrame_Navigated)

+1

Я использую тот же код. И я столкнулся с этой проблемой. –

+0

В RootFrame_Navigating вы изменили тест для /MainPage.xaml, чтобы он соответствовал вашему имени главной страницы? Вы изменили всю свою навигацию в другом месте приложения, чтобы добавить параметр «DeepLink = true»? Эти шаги требуются для того, чтобы получить образец кода для вас. Его работа прекрасна для меня после этого. –

0

код, как указано испортит. Это не соответствует комментариям. Посмотрите на RootFrame_Navigating - mustClearPagesStack внизу установлен на false - но посмотрите комментарии в исходной ссылке MSDN - в двух местах над ним говорится, что стек страницы должен быть очищен .... но поскольку флаг установлен в false, это перепутались. Поэтому установите флаг false сверху, но затем установите его в true в двух условиях «если», где он говорит. Тогда он будет работать как чемпион.

Смежные вопросы