zoukankan      html  css  js  c++  java
  • windows phone 墓碑化(9)

    几个术语的理解:

    名称

    说明

    Launched

    启动新程序的启动

    Closed

    通过Back按键关闭程序

    Deactivated

    一个正在程序运行,此时按start键,程序停用,此后进入墓碑化

    Activated

    程序从墓碑化复活,即激活

    那么我们程序的生命周期也就大致显示出来了:

     

    生命周期的描述:当我们在start页面运行一个程序A时,此时程序A进入启动(Launched)阶段,启动完成之后,程序一般会相当长的时间处于running状态,如果此时你按Back键,则直接进入Closed状态,还有就是在运行过程中有突发事件,比如来电话,来信息,或者你需要运行程序B,你就按Start键,在按Start键的时候处于Deactivated状态,然后在运行程序B的过程中,程序A一直处于Tombstoning墓碑化状态(除非你从Start页重新启用程序A的新实例),在操作程序B的过程中你如果长按Back键,系统会调出卡片式任务管理器,里面就会包含程序A,程序B,Start页面,如果点击程序A,此时程序A就会被激活,进入运行状态,之至改程序被关闭,程序A的生命周期就完成了;

     在App.xaml.cs文件中可以找到改变这几个状态时所触发的事件,事件里面有注解就不在详细说明了

    View Code
    // 应用程序启动(例如,从“开始”菜单启动)时执行的代码
            
    // 此代码在重新激活应用程序时不执行
            private void Application_Launching(object sender, LaunchingEventArgs e)
            {
                //可以从独立存储空间读取资料进行初始化
            }

            // 激活应用程序(置于前台)时执行的代码
            
    // 此代码在首次启动应用程序时不执行
            private void Application_Activated(object sender, ActivatedEventArgs e)
            {
                //可以恢复临时数据
               
               
            }

            // 停用应用程序(发送到后台)时执行的代码
            
    // 此代码在应用程序关闭时不执行
            private void Application_Deactivated(object sender, DeactivatedEventArgs e)
            {
                //存储临时数据,以便用户从墓碑化状态激活
                
            }

            // 应用程序关闭(例如,用户点击“后退”)时执行的代码
            
    // 此代码在停用应用程序时不执行
            private void Application_Closing(object sender, ClosingEventArgs e)
            {
                //程序按Back键时,可以存储到独立存储空间
            }

    效果:

     

    那么下面的案例就是在用户关闭程序后,在从任务管理器中重新激活或者通过Back键返回到程序,进行数据的暂存;其实就是让用户感觉不到程序已经关闭了,当用户程序回到程序时,和用户离开时呈现出来的相一致;

     由于MainPage.xaml页面没有任何修改,所以没有贴出,MainPage隐藏文件代码:

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using Microsoft.Phone.Controls;
    //
    using Microsoft.Phone.Shell;

    namespace Tombstoned
    {
        public partial class MainPage : PhoneApplicationPage
        {
            int sum = 0;
            App ap = (App)Application.Current;
            // 构造函数
            public MainPage()
            {
                InitializeComponent();
            }
            //经验证此方法只有在程序启动的时候才加载
            private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
            {
                //this.ApplicationTitle.Text = ap.appKey;
            }
            protected override void OnManipulationStarted(ManipulationStartedEventArgs e)
            {
                sum++;
                //程序标题处显示
                this.PageTitle.Text = sum.ToString();
                ap.appKey = this.PageTitle.Text;
                base.OnManipulationStarted(e);
            }

            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                if (!string.IsNullOrEmpty(ap.appKey))
                {
                    this.PageTitle.Text = ap.appKey;
                }
             
                base.OnNavigatedTo(e);
            }
           
        }
    }

     从上面代码中可以看出我们是把数据保存到App类中的一个公共属性中了,我们在触摸事件中把自加的数值赋值于App公共属性appKey,在MainPage页面加载后调用OnNavigatedTo方法进行初始化,可以看出我们把临时数据保存在App类中了,那么App类中是怎么实现的那;App类隐藏文件中添加的代码如下:

     public string appKey { getset; }

     即保存数据的公共属性,其中我们用到的两个方法,并把他们实现:

    View Code
      // 激活应用程序(置于前台)时执行的代码
            
    // 此代码在首次启动应用程序时不执行
            private void Application_Activated(object sender, ActivatedEventArgs e)
            {
                //可以恢复临时数据
                object str=string.Empty;

                if (PhoneApplicationService.Current.State.TryGetValue("key"out str))
                {
                    appKey=str.ToString();
                }
               
            }

            // 停用应用程序(发送到后台)时执行的代码
            
    // 此代码在应用程序关闭时不执行
            private void Application_Deactivated(object sender, DeactivatedEventArgs e)
            {
                //存储临时数据,以便用户从墓碑化状态激活
                PhoneApplicationService.Current.State["key"] = appKey;
            }

     可以看到我们是在用户遇到突发事件(如电话)时用PhoneApplicationService.Current.State进行存储的,并在用户通过任务管理器或者Back键时激活改程序,并用

    PhoneApplicationService.Current.State.TryGetValue方法获取值,该方法的好处是不会报出异常信息;任务管理器的的效果图:

     

     windows phone 7 对多个应用程序的管理:windows phone 7 是通过栈对多个程序进行管理的,当我们运行程序A的时候,如果我们需要运行程序B,那么我们会按Start键,Start键就会把程序A压入栈中(此时程序A是停止运行的),如果需要运行程序C,同样程序B也会被压入栈中,那么按Back键就会把当前程序C终止,并从栈中获得最后一个压入程序B,进行激活使用;

    作者:神舟龙
        
     

    新建的wp開發者群:42182428 

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Solr 规格严格
    createsimplepojoclassesbytecodeatruntimedynamically 规格严格
    Mongo 规格严格
    Java Classpath 规格严格
    ClassLoader 规格严格
    Lucene 规格严格
    封包和拆包
    NetBeans 时事通讯(刊号 # 25 Sep 11, 2008)
    安全注释和授权在 GlassFish 和 Java EE 5 SDK 中的应用
    Building Enterprise Applications for GlassFish using Netbeans IDE and Maven2
  • 原文地址:https://www.cnblogs.com/shenzhoulong/p/2447817.html
Copyright © 2011-2022 走看看