目前的智能手机,硬件上已经可以媲美几年前的PC机了,1G内存,512M以上内存,3.5以上的屏幕,3G,WIFI等等都成为了新的手机的最低标准。而Windows Phone也一改以往WM手机硬件差异大的问题,设定了最低的硬件标准。相对于以前系统,性能上,操作上,流畅度上也有了很大提高。但是电池的发展远远跟不上手机的耗电量。大的也就1500MA的电池,最多也就使用1天多,大部分每天都用充电。为了节约电量,各个平台的手机都推出了一些省电的措施。

对于Windows Phone来说,刚推出时和Iphone第一版一样,不支持多任务,一方面是为了给前台程序提供更多的资源,更流畅的体验,另一方面也是为了介绍电池的消耗。同事采用了消息推送机制来完成一部分后台操作,也使用了一种名为墓碑机制来对实现所谓的了“伪多任务”。  到了最新的“芒果”系统,已经支持了多任务,但也不同于以往WM说或PC上的多任务,也改进了墓碑机制,加快了程序间的切换。我们这一篇文章就了解下Windows Phone平台的伪多任务。

 

 

一 伪多任务

 

 

在我们使用PC和WM系统时,多任务对我们来说是理所应当的。一边听歌,一边上QQ,还能上微博发照片。可到了Windows Phone上却不支持多任务了,对于一个新的智能系统来说,确实无法让人接受。但是多任务存在一个问题就是如果开的任务过多,系统用起来就会比较卡,在WM系统中这种情况比较常见。为了提供用户的体验,目前的一些智能系统都放弃了这种传统的多任务方式,而采用了伪多任务,有限制的多任务和消息推送这些方法。

所谓的伪多人他并不是真正的多任务,只是通过一些处理,让用户使用起来感觉不到和多任务有什么区别。在Windows Phone中采用了墓碑机制来实现伪多任务。墓碑这个名字也很恰当。当我们运行了一个程序后,切换到另一个程序,这时因为是单任务,第一个程序会被终止掉,但是采用墓碑机制,保存了程序当前的状态和数据,当我们在切换回的时候,虽然是启动了一个新的实例,但是可以通过墓碑来恢复到之前的状态,所以用户感觉不到有什么区别。

墓碑机制是系统自动完成的,但是数据的保存和恢复则是我们通过代码控制的。另外墓碑机制也不是万能的,因为此时程序是终止的,如果有一些下载,播放,计时的功能就无法通过墓碑机制完成到了。Windows Phone 7则通过推送机制来解决部分问题,而WP7.1 SDK中也提供了一些后台操作来解决这些问题,这一篇文章我们主要介绍墓碑机制。

继续阅读

前面几乎每篇文章都会涉及到页面的切换,页面导航,从程序启动开始,到结束。上一篇文章介绍了页面导航时会发生的几个事件以及页面中传值的方法。这一篇文章将介绍对导航的一些控制。

 

 

一 导航栈

 

 

从Windows Phone 手机上我们就可以看到,手机有Back键,但是没有Forward按键。而我们在前面例子中也基本都是使用GoBack()方法。看下MSDN,关于Forward的描述如下:

Navigates to the most recent entry in the forward navigation history, or throws an exception if no entry exists in forward navigation. For Windows Phone this method will always throw an exception because there is no forward navigation stack. 

上面告诉我们,在Windows Phone 中没有Forward Stack,而只有Back Stack,所以我们使用GoBack后没有办法在使用GoForward前进到上一个页面。而当我们进入到一个新的页面时,上一个页面就会被存放到Back Stack中,当我们点击Back按钮,或使用GoBack方法时就会销毁当前的页面,而从Back Stack中弹出上一页面。如果Back Stack中没有页面,此时点击Back按钮程序就会退出,而是用GoBack方法就会抛出异常,所以我们在使用时最先对CanGoForward属性进行判断。

在WP7.1版本中我们注意到,在NavigationService类下面多了一个BackStack的属性。

public IEnumerable<JournalEntry> BackStack
{
    get
    {
        return this._journal.BackStack;
    }
}

还记得在前面文章介绍Navigate方法的时候,见到到一下代码:

JournalEntry journalEntry = new JournalEntry(uri.OriginalString, uri);
this.Journal.AddHistoryPoint(journalEntry);

继续阅读