欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Windows Phone开发(3):棋子未动,先观全局

程序员文章站 2022-05-13 22:00:46
在进行wp开发之前,与其它开发技术一样,我们需要简单了解一个wp应用序的生命周期,我们不一定要深入了解,但至少要知道在应用程序生命周期内的每一阶段,我们应当做什么,不推荐哪些操作等,这也是为了让我们...

在进行wp开发之前,与其它开发技术一样,我们需要简单了解一个wp应用序的生命周期,我们不一定要深入了解,但至少要知道在应用程序生命周期内的每一阶段,我们应当做什么,不推荐哪些操作等,这也是为了让我们开发出更高性能,更优秀的应用程序打下坚实的基础。


下图是官方给出的wp应用程序执行模型图。

 Windows Phone开发(3):棋子未动,先观全局

 

在上图中,我们要注意以下四个事件:

1、launching 事件。

说白了,就是应用程序刚启动时触发的事件,由于这个事件的一点特殊性,尽量不要在该事件处理程序中做大量的操作,比如比较耗时间的作业,为什么呢?你想想,如果你的某个操作需要消耗大量时间的话,那么,你肯定会发现,程序启动的速度很慢,这样一来,用户会很不爽,用户体验就大打折扣。

2、activated事件。

应用程序被激活时触发,例如,我的程序上面有一个按钮,用户点击后打开发短信的“窗口”,当用户发送完短信后,发短信的页面就关闭,这时候,我们的应用程序又从后台程序变为前台程序了,activated事件将触发,注意的是,第一次启动程序时是不触发该事件的。

3、deactivated事件。

与activated事件相对,比如上面举的例子,当我在程序上点击按钮时,发送短信的页面将启动,这时候,当前应用程序就被前面的发短信的页面挡住了,也就是说,当前程序被发送到后台,这个时刻就触发了deactivated事件。不过,如果应用程序将关闭,该事件不触发。

4、closing事件。

从字面意思就猜到该事件在啥时候发生了。对,当应用程序关闭时发生,但在应用程在导航中被发送到后台时不发生,比如刚才说的打开发短信的页面后,虽然程序被发送到后台了,但由于它仍在运行,没有退出,所以这个时候不触发。但如果我从“开始”或桌面磁砖中启动程序后,然后再通过“返回”键回到桌面,这个时候因为程序会退出,所以该事件触发。

 

为了验证这些事件是如何发生的,我们在app.xaml.cs文件中,分别为这几个事件写下调试输出代码。

[csharp]
// 应用程序启动(例如,从“开始”菜单启动)时执行的代码  
// 此代码在重新激活应用程序时不执行;  
private void application_launching(object sender, launchingeventargs e) 

    system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序首次启动。"); 

 
// 激活应用程序(置于前台)时执行的代码  
// 此代码在首次启动应用程序时不执行  
private void application_activated(object sender, activatedeventargs e) 

    system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序被激活。"); 

 
// 停用应用程序(发送到后台)时执行的代码  
// 此代码在应用程序关闭时不执行  
private void application_deactivated(object sender, deactivatedeventargs e) 

    system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序休眠。"); 

 
// 应用程序关闭(例如,用户点击“后退”)时执行的代码  
// 此代码在停用应用程序时不执行  
private void application_closing(object sender, closingeventargs e) 

    system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序关闭。"); 

        // 应用程序启动(例如,从“开始”菜单启动)时执行的代码
        // 此代码在重新激活应用程序时不执行;
        private void application_launching(object sender, launchingeventargs e)
        {
            system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序首次启动。");
        }

        // 激活应用程序(置于前台)时执行的代码
        // 此代码在首次启动应用程序时不执行
        private void application_activated(object sender, activatedeventargs e)
        {
            system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序被激活。");
        }

        // 停用应用程序(发送到后台)时执行的代码
        // 此代码在应用程序关闭时不执行
        private void application_deactivated(object sender, deactivatedeventargs e)
        {
            system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序休眠。");
        }

        // 应用程序关闭(例如,用户点击“后退”)时执行的代码
        // 此代码在停用应用程序时不执行
        private void application_closing(object sender, closingeventargs e)
        {
            system.diagnostics.debug.writeline(datetime.now.toshorttimestring() + " - 应用程序关闭。");
        }
 
然后,我们运行程序,当主页面出现后,点击模拟器上的“返回”键把程序关闭。

这时候,我们再去看一下“输出”窗口。

 Windows Phone开发(3):棋子未动,先观全局


 

通过这个实验,我们发现activated事件和deactivated事件未被触发,为什么?自己思考吧。


下面,我们在页面中放一个按钮,点击按钮后,打开发送短信的页面。

[html]
<!--contentpanel - 在此处放置其他内容--> 
<grid x:name="contentpanel" grid.row="1" margin="12,0,12,0"> 
    <button verticalalignment="top" 
            horizontalalignment="center" 
            content="请点击我" 
            fontsize="64" 
            click="button_click" 
            margin="0,12,0,0"/> 
</grid> 
        <!--contentpanel - 在此处放置其他内容-->
        <grid x:name="contentpanel" grid.row="1" margin="12,0,12,0">
            <button verticalalignment="top"
                    horizontalalignment="center"
                    content="请点击我"
                    fontsize="64"
                    click="button_click"
                    margin="0,12,0,0"/>
        </grid>
 

编写单击事件代码。

[csharp]
private void button_click(object sender, routedeventargs e) 

    microsoft.phone.tasks.smscomposetask sms = new microsoft.phone.tasks.smscomposetask(); 
    sms.to = "13672265138"; 
    sms.body = "你好啊,今天中午请我吃牛肉炒饭吗?"; 
    sms.show(); 

        private void button_click(object sender, routedeventargs e)
        {
            microsoft.phone.tasks.smscomposetask sms = new microsoft.phone.tasks.smscomposetask();
            sms.to = "13672265138";
            sms.body = "你好啊,今天中午请我吃牛肉炒饭吗?";
            sms.show();
        }
 

按f5运行,再点击按钮,打开发短信页面。

 Windows Phone开发(3):棋子未动,先观全局

 

看看“输出”窗口,这时候,就看到deactivated事件发生了,因为程序还没有退出,只是被放到后台。

 Windows Phone开发(3):棋子未动,先观全局

 

接着,点击模拟器的“返回”,退回到我们的程序。再看看输出窗口。

 Windows Phone开发(3):棋子未动,先观全局

 

这个时候,activated事件就发生了。


ok,今天的牛皮就吹到这里吧。

 

摘自 tcjiaan的专栏