WP7 Dev 101 【6】 如何退出你的程序?

本文介绍了Windows Phone 7 (WP7) 中程序退出的机制。由于WP7配备硬件Back键,程序通常通过此键实现退出操作。文中还探讨了两种非常规退出方法:使用XNA框架的Game.Exit()方法(不推荐)和抛出自定义异常来实现程序关闭。

WP7 Dev 101 【6】 如何退出你的程序?

作者:
Breakstring
分类:
开发技术
发表于2010-10-22
  

或许你会注意到,在Silverlight for Windows Phone程序中,并没有之前的类似于“App.Exit()”之类的函数用来让你退出程序。这是怎么回事儿呢?

很简单,在Windows Phone 7中系统要求配备了硬件的“Back”键,该键用于在程序中导航(返回)到上一个页面(屏幕)或者应用程序。当菜单、对话框、搜索框、虚拟键盘等打开时,点击它则关闭菜单、对话框、搜索框和虚拟键盘等。

当应用程序停留在该程序的第一个界面的时候,如果按下返回键,则该程序会自动关闭并回到打开该程序的上一个界面。由于该动作是系统默认用来关闭程序的方法,所以并不需要你在代码中强行退出该程序。所以,微软并没有留下退出程序的函数供你调用。

如果。。。嗯,我是说如果你非要在代码中关闭程序呢?也不是没办法。

第一种办法, 调用XNA中的退出方法,为了节约系统资源,XNA中提供了退出游戏的方法

  1. 添加对Microsoft.Xna.Framework.Game的引用;
  2. 调用Game.Exit()来退出程序。

但是请注意,不要使用该方法 。因为该方法违反了微软的应用程序验证的规范,将会导致你的程序无法提交到Marketplace中去。

第二种方法, 抛出自定义的Quit异常来退出程序

在App.xaml.cs文件中的App类添加如下代码:

Code Snippet
  1. private class QuitException : Exception { }
  2. public static void Quit()
  3. {
  4.     throw new QuitException ();
  5. }

在App类的Application_UnhandledException方法中添加代码,使得它看起来如下:

 

Code Snippet
  1. // Code to execute on Unhandled Exceptions
  2. private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
  3. {
  4.     if (e.ExceptionObject is QuitException )
  5.         return ;
  6.  
  7.     if (System.Diagnostics.Debugger .IsAttached)
  8.     {
  9.         // An unhandled exception has occurred; break into the debugger
  10.         System.Diagnostics.Debugger .Break();
  11.     }
  12. }

然后确保App.xmal中具有设定了UnhandledException的处理:

Code Snippet
  1. UnhandledException ="Application_UnhandledException"

好了,最后只需要在你想要退出程序的地方调用”App.Quit()”方法就可以退出程序了。

这节内容结束。更多101系列文章参见WP7 Dev 101索引

#!/bin/sh echo 'image_recovery.sh' SUCCESS=0 FAILURE=1 ERROR=2 RETURNDATA=$SUCCESS FSBL_DEV=/dev/mtd0 UBOOT_DEV=/dev/mtd1 UBOOT_BAK_DEV=/dev/mtd2 FSBL_SW_WP=/sys/class/mtd/mtd0/software_wp UBOOT_SW_WP=/sys/class/mtd/mtd1/software_wp UBOOT_BAK_SW_WP=/sys/class/mtd/mtd2/software_wp # check first run if [ ! -f /mnt/update/image_checked ]; then data=`dd if=$FSBL_DEV bs=8 count=1 status=none |xxd -p` if [ $data != "ffffffffffffffff" ]; then echo "Backup fsbl and uboot image" [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$FSBL_DEV of=$UBOOT_BAK_DEV bs=2048 count=128 dd if=$UBOOT_DEV of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP fi touch /mnt/update/image_checked fi # check/recover fsbl image mtd_need_rec=0 mtd_bak_need_rec=0 data=`dd if=$FSBL_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_need_rec=1 fi data=`dd if=$UBOOT_BAK_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_bak_need_rec=1 fi if [ $mtd_need_rec == 0 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Recover image fsbl_bak from fsbl!" dd if=$UBOOT_BAK_DEV of=/tmp/image_cache bs=2048 skip=128 count=576 #backup uboot_bak [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$FSBL_DEV of=$UBOOT_BAK_DEV bs=2048 count=128 dd if=/tmp/image_cache of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP rm /tmp/image_cache elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 0 ]; then echo "Recover image fsbl from fsbl_bak!" [ -f $FSBL_SW_WP ] && echo 0 > $FSBL_SW_WP flash_eraseall $FSBL_DEV dd if=$UBOOT_BAK_DEV of=$FSBL_DEV bs=2048 count=128 sync [ -f $FSBL_SW_WP ] && echo 1 > $FSBL_SW_WP elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Both fsbl and fsbl_bak images are broken!" fi # check/recover u-boot image mtd_need_rec=0 mtd_bak_need_rec=0 data=`dd if=$UBOOT_DEV bs=8 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_need_rec=1 fi data=`dd if=$UBOOT_BAK_DEV bs=8 skip=32768 count=1 status=none |xxd -p` if [ $data == "ffffffffffffffff" ]; then mtd_bak_need_rec=1 fi if [ $mtd_need_rec == 0 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Recover image uboot_bak from uboot!" dd if=$UBOOT_BAK_DEV of=/tmp/image_cache bs=2048 count=128 #backup fsbl_bak [ -f $UBOOT_BAK_SW_WP ] && echo 0 > $UBOOT_BAK_SW_WP flash_eraseall $UBOOT_BAK_DEV dd if=$UBOOT_DEV of=$UBOOT_BAK_DEV bs=2048 seek=128 count=576 dd if=/tmp/image_cache of=$UBOOT_BAK_DEV bs=2048 count=128 sync [ -f $UBOOT_BAK_SW_WP ] && echo 1 > $UBOOT_BAK_SW_WP rm /tmp/image_cache elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 0 ]; then echo "Recover image uboot from uboot_bak!" [ -f $UBOOT_SW_WP ] && echo 0 > $UBOOT_SW_WP flash_eraseall $UBOOT_DEV dd if=$UBOOT_BAK_DEV of=$UBOOT_DEV bs=2048 skip=128 count=576 sync [ -f $UBOOT_SW_WP ] && echo 1 > $UBOOT_SW_WP elif [ $mtd_need_rec == 1 ] && [ $mtd_bak_need_rec == 1 ]; then echo "Both uboot and uboot_bak images are broken!" fi exit $RETURNDATA这个shell脚本里面各行是啥意思
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值