• wp7 生命周期及多任务 详解


    APP生命周期:

      单个app运行时:

        启动(Launching)------进入页面(OnNavigationTo)------离开页面(OnNavigationFrom)------关闭(Closing)

      多个app运行时:

        1. 启动(Launching)-------进入页面(OnNavigationTo)------离开页面(OnNavigationFrom)------休眠(Deativate)------从休眠中激活(Activate)

            ------进入页面(OnNavigationTo)------离开页面(OnNavigationFrom)------关闭(Closing)

        2.   启动(Launching)-------进入页面(OnNavigationTo)------离开页面(OnNavigationFrom)------休眠(Deativate)------墓碑化(Deactivate)------

            从墓碑化中激活(Activate)------进入页面(OnNavigationTo)------离开页面(OnNavigationFrom)------关闭(Closing)

             

    说明:

    1.首次启动app时会触发Launching 事件,可以在这一步完成一些初始化的操作,但不要做太耗时的工作,否则会让启动变慢,给用户很卡的感觉。

    2.加载完成后app处于Running状态,如果按下Back按钮会触发回退事件,若是在首页则触发Closing事件退出程序,如果不是首页则回退到上一页面。

    3.在App运行中按下“开始”按钮则程序不会立即关闭,而是触发Deactivate事件,app进入tombstoning(墓碑化)状态,之后呈现瓷砖首页。

    4.这个时候按下Back按钮 会触发Activate 事件使app重新回到Running 状态

    注意: 在wp7.1中已经实现伪多任务状态,即增加一种休眠状态

    在墓碑化的过程中 其实进程已经被kill,只因开发者保存了部分状态在隔离存储空间或者内存中(回退栈信息)。到了wp7.1时代新增了 休眠状态,也就出现了现在的伪多任务

    休眠:程序在Running状态时 点击了“开始”按钮,或者是在程序中启动了另外一个应用程序时,原程序就会进入休眠状态。

       休眠状态时,程序停止运行(和墓碑机制相同),但程序还处于内存中(和墓碑机制不同,墓碑机制是直接被kill)。

       当恢复这个程序时 就不需要再创建一个新实例(墓碑需要创建新实例),这样就加快程序恢复和切换速度。而且休眠状态时我们不需要去恢复数据。

    在wp7.1中长按 回退 按钮 会出现程序列表,然后选择在前台执行的程序。休眠状态的程序会占用部分内存资源,当前台程序运行时内存不够或者运行不流畅时,系统会自动将部分休眠状态程序墓碑化。在内存足够且程序运行流畅时,休眠状态的程序也是有限制的,最多允许出现5个休眠程序,当超过时会自动将前面的休眠程序墓碑化。

    由于wp7没有提供exit退出,所以我们恢复程序可能是从休眠状态或者墓碑状态来恢复,

    1.从休眠状态恢复时我们不需要恢复保存的数据

    2.从墓碑状态恢复时需要恢复保存的数据

    so wp7.1中提供了 IsApplicationInstancePreserved 参数来判断程序是从休眠状态还是墓碑状态恢复

    下面以代码示例,数据的保存和恢复,主要用到一下6个函数

    App.xml.cs:

          Application_Launching  //启动

          Application_Activated  //激活

          Application_Deactivated  //休眠

          Application_Closing    //关闭

    Page.cs:

          OnNavigationTo  //跳转进

          OnNavigationFrom  //跳转出

     

    Launching 在程序启动时调用,在程序从休眠或者墓碑机制中恢复过来时不调用,用来处理一些耗时极短的信息

    private void Application_Launching(object sender, LaunchingEventArgs e)
            {
                using (IsolatedStorageFile Iso = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if(IsolatedStorageSettings.ApplicationSettings.Contains(IsoSetting1))
                    {
                        IsoContext = IsolatedStorageSettings.ApplicationSettings[IsoSetting1] as string;
                    }
                }
            }

    Closing 在程序关闭时调用,程序从休眠或者墓碑状态恢复时不调用,用这个函数保存一下信息

    private void Application_Closing(object sender, ClosingEventArgs e)
            {
                using (IsolatedStorageFile Iso = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    IsolatedStorageSettings.ApplicationSettings[IsoSetting1] = IsoContext;
                }
            }

    Deactivate 在程序失去激活时调用,程序关闭时不调用,通常使用这个函数来保存程序进入墓碑化是存储的一些信息,通过Application中的 State 保存

    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
            {
                PhoneApplicationService.Current.State[IsoSetting1] = IsoContext;
            }

    Activate 程序在被重新激活时调用,即从墓碑或者休眠状态恢复时调用,在程序启动时不调用。使用这个方法来恢复程序从墓碑化激活时需要恢复的一些程序集信息,通过IsApplicationInstancePreserver 来判断程序是通过休眠还是墓碑恢复的

    private void Application_Activated(object sender, ActivatedEventArgs e)
            {
                if (!e.IsApplicationInstancePreserved)
                {
                    IsoContext = PhoneApplicationService.Current.State[IsoSetting1] as string;
                }
            }

    OnNavigationFrom 方法是在离开该页是调用,用这个方法保存一些页面级的信息,通过page的State来保存

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedFrom(e);
                if (e.NavigationMode != System.Windows.Navigation.NavigationMode.Back)
                {
                    State[numsetting1] = num; 
                }
            }

    OnNavigationTo 在进入该页面时调用,用这个方法恢复一些页面级的信息

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
                if (e.NavigationMode != System.Windows.Navigation.NavigationMode.New)
                {
                    if (State.ContainsKey(numsetting))
                    {
                        num = State[numsetting] as string;
                    }
                }
            }

     

    说明:本文主要参考 Kingly 和 东子哥的博文。

  • 相关阅读:
    Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    reversePairs
    sort
    分割数组的最小值
    decode string
    276. 栅栏涂色
    133. Clone Graph
    Palindromic string
    爬楼梯
    正则匹配
  • 原文地址:https://www.cnblogs.com/bubo/p/2518512.html
Copyright © 2020-2023  润新知