当前位置:编程学习 > wap >>

Windows phone 7之生命周期

WP7的生命周期一般说的是整个应用程序的声明周期,而不注重页面的生命周期,这跟Android是不一样的。WP7的生命周期基本如下图所示

 \


 

应用程序基本分为四个状态,启动,关闭,激活和挂起。App类提供了4个事件,以便于程序处于不同状态时,开发人员可以对其做一些相应的处理。

1、Launching事件,第一次启动时触发,用户可以做一些初始化工作,比如加载一些数据

2、Closing事件,程序关闭时触发,用户可以做一些保存工作,以便用户下次打开层序时做一些还原

3、Activated事件、但程序被挂起之后,再次被激活时触发,可以做一些回复页面状态的工作,主要是数据,页面UI不用过多处理,WP7的墓碑机制会为你做

4、Deactivated事件、程序挂起是触发,比如你正玩微博,突然来电话了,微博程序会被挂起,你可以再事件中做一些临时数据保存的措施

以上是针对整个应用程序而言的,页面也有生命周期只是通常不被强调,其实也是很有用的,页面生命周期比较简单,主要是加载,卸载,而每个控件都有其加载和卸载状态,所以,页面的生命周期并不是完整意义上的生命周期,只是一种状态。开发人员可以根据页面的状态做一些相应的处理。

下面说一下页面中最有用的几个事件

Loaded和Unloaded事件,页面加载和卸载时触发,加载时可以处理一些数据(微软不建议这么做,因为这会是页面加载很卡,那些页面切换动画就无法流畅的运行,给人感觉就是突然一下就蹦出个页面),卸载时可以保存数据

OnBackKeyPress事件,按后退按钮时触发,微软官方对后退按钮的用法建议是,如果当前页面中有输入法之类的子操作,则将其关闭而不退出本页,如果没有的话,退出本页,返回前一页,如果当前是程序首页则退出程序。在OnBackKeyPress事件中我们可以做很多事前,比如判断页面中是否有弹出层,如果有,则不退出本页,只关闭弹出层,如果是程序首页,则弹出确认框,提升用户是否真的要退出程序。后退按钮有关页面跳转的机制基本如下图

 \


 

如图,WP7是用栈来存储页面的,后退按钮永远返回前一个页面,也就是你从那个页面来就回那个页面去。
OnNavigatedFrom事件,当从此页面中跳转走时触发;
通过一个简单的例子看一下这几个事件的调用
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;

namespace ShengMingZhouQi
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
 public MainPage()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
            this.Unloaded += new RoutedEventHandler(MainPage_Unloaded);
        }
        int count = 0;
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            count += 1;
        }
        void MainPage_Unloaded(object sender, RoutedEventArgs e)
        {
            count = 0;
        }
        protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            base.OnBackKeyPress(e);
        }
        protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
            if (count == 0)
            {
                ////
 }
            base.OnNavigatedFrom(e);
        }
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            count += 1;
            MessageBox.Show(count.ToString());
            base.OnNavigatedTo(e);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/NewPage.xaml", UriKind.Relative));
        }
    }
}
上述是MainPage.xaml中的代码,打开程序时,或者跳转到NewPage.xaml后在跳回来时,结果如下图
 \
 
\

我们发现了,程序先调用OnNavigatedTo事件,再调用MainPage_Loaded,这事也情理之中的的事,一来是必须先到页面才能加载,而来,这MainPage也是Page内部的一部分,记载要到了页面才行
OnNavigatedFrom和Unloaded事件是反过来的,先调用OnNavigatedFrom再调用Unloaded,这里就不给图了
现在说一下程序状态恢复与保存 www.zzzyk.com
在程序挂起后再次被激活,页面状态是会被自动恢复的,这事WP7系统自己处理的,现在给MainPage.xaml添加一个Button和一个TextBlock,点击Button,改变TextBlock的Text为"ClickButton",运行结果如下图

  
在Application_Deactivated和Application_Activated事件里添加断点,点击模拟器上的Window键,显示手机的主菜单Application_Deactivated事件被触发,

点击回退按键,看到Application_Activated事件被触发,按F5,界面重新回到MainPage.xaml上

发现页面并不是初始化时的样子,也就是TextBlock值是"ClickButton",看到系统会帮你维护挂起的程序,并在重新机会时自动恢复其原来的状态。这就是墓碑机制。
但是如果你关闭程序,再次打开,那之前的状态时不可能给你保存的,因为墓碑机制只适用于挂起的程序,而非关闭的程序。这种情况你必须自己恢复,怎么恢复呢,那就要用刀独立存储了,关闭前,将的必要的内容保存起来,程序启动后再取出来,恢复现场,看下面的代码,使用IsolatedStorageFile做保存和恢复现场工作,IsolatedStorageSettings同样适用。
 
 

app.xaml.cs
// Code to execute when the application is launching (eg, from Start)
        // This code will not execute when the application is reactivated
 private void Application_Launching(object sender, LaunchingEventArgs e)
        {
            if (fileStorage.FileExists("newText.txt"))
            {
&

补充:移动开发 , Windows Phone ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,