Search code examples
c#windows-phone-7application-lifecycletombstoning

Windows Phone 7: Establishing which page is being activated during the Application_Activated event


I am following the general best practice principles of restoring my persistent and none persistent state and objects when a tombstoned app is re-activated. Which can be found in this very good Microsoft article

here

The samples only show a simple re-activation of the main page of an app. However as my application has multiple pages (any of which could be tombstoned and therfore re-activated) and each one is binding to a different ViewModel object. I would like to know how to ascertain which page is ultimately going to be activated so that I can selectivly deserialize and recover the correct ViewModel object for that page.

Or is the best practice to restore all ViewModels or is there another design pattern for this?


Solution

  • I have implemented a simple pattern that is best described as -

    1. In the application's Activated and Deactivated event, I send a message to subscribing pages.
    2. The pages that subscribe to the message do the serialization/deserialization of data.

    I am using Laurent Bugnion's excellent MVVMLight library for Windows Phone 7. Here is some sample code illustrating the message broadcast -

    // Ensure that application state is restored appropriately
    private void Application_Activated(object sender, ActivatedEventArgs e)
    {
       Messenger.Default.Send(new NotificationMessage<AppEvent>(AppEvent.Activated, string.Empty));
    }
    
    // Ensure that required application state is persisted here.
    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
    {
       Messenger.Default.Send(new NotificationMessage<AppEvent>(AppEvent.Deactivated, string.Empty));
    }
    

    Within the constructor of a ViewModel class, I setup the subscription to the notification messages -

    // Register for application event notifications
    Messenger.Default.Register<NotificationMessage<AppEvent>>(this, n =>
    {
       switch (n.Content)
       {
          case AppEvent.Deactivated:
             // Save state here
             break;
    
          case AppEvent.Activate:
             // Restore state here
             break;
       }
    }
    

    I found that with this strategy, all the data relevant to the page that is bound to a ViewModel is saved and restored properly.

    HTH, indyfromoz