WP7开发第一课:软件生命周期(其二)

  • 接下来讲解下:闲置侦测
  • 什么是系统闲置侦测呢?WP7系统在一段时间没有操作后,为节省电源,屏幕会变暗,而再经一段时间后,便会锁定设备,将屏幕整个关闭。进入了生命周期中的 Deactivated 事件。但如果我们应用播放音乐呢?这样肯定是不行的,于是出现了“系统闲置侦测”,要设定 Idle detection 。
  • WP7 中,Idle detection 有两种,一种是应用级别的,一股是用户级别的:
    • ApplicationIdleDetectinMode
    • UserIdleDetectionMode

ApplicationIdleDetection 是应用程序闲置状态侦测,例如经过一段时间没有使用的话,设备会进入锁定,并且引发应用程序的 Deactivated 事件,随后应用程序进入 tombstoning 墓碑状态(墓碑是记录死亡信息的);ApplicationIdleDetectionMode 便是设定设备进入锁定时,应用程序会不会进入 tombstoning 墓碑状态,如果设定为关闭,那么将不会引发应用程序的 Deacticated 事件,也不会将应用程序进入 tombstoning 墓碑状态 ;好处有:

  • 应用程序仍然在执行中
  • 当用户返回应用程序时,由于没有进入 tombstoning 墓碑状态,能够快速回复

而要注意的:

  • 应用程序仍然在执行,所以会继续的消耗电池的电力;请特别注意,设备同样会进入锁定状态,只是应用程序不会停止
  • 所有有关 UI 的更新动作应该要停止,以节省电力的消耗
  • 所有动画、Timer 等动作应该要停止
  • Sensor 将会停止回报(例如 accelerometer 将会停止回报目前的数值)
  • 在改变闲置侦测模式时,永远要先询问使用者是否同意

tombstoning 墓碑机制主要用于在后台运行程序,毕竟WP7尚未支持多任务处理,可以用此机制模拟多任务。墓碑机制感觉跟耶稣死亡,三天后再度复活差不多。

获取目前 ApplicationIdleDetectionMode 的状态,以及判断目前设备是不是被锁定。

WP7开发第一课:软件生命周期(其二)

由上图可知由外向内为:PhoneApplicationFrame-->时间、信号状态栏、Application bar 、 Page-->Content

 Obscured、UnObscured 事件,这两个事件便是发生在 PhoneApplicationFrmae 中:

Obscured事件便是当进入锁定时会引发的事件,在这个事件中,可以去做将 Storyboard、UI 的更新动作停止的相关动作。

using Microsoft.Phone.Shell;

Pprivate void SetAppIdleDetectionDisable()

        {

            //將應用程式閒置狀態偵測關閉

            PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDeectitonMode.Disabled;

            PhoneApplicationFrame root = (App.Current.RootVisual) as PhoneApplicationFrame;

            if (root != null)

            {

                root.Obscured += new EventHandler<ObscuredEventArgs>(root_Obscured);

                root.Unobscured += new EventHandler(root_Unobscured);

            }

            else

                MessageBox.Show("Error");

        }

把闲置状态侦测关闭之后,接着就是取得 PhoneApplicationFrame ,而 PhoneApplicationFrame 时也是透过 App 类别来取得,取得之后由于在相关的事件必须要有对应的处理动作,因此必须要挂载相关的事件;其中 Obscured 事件便是当进入锁定时会引发的事件,在这个事件中,可以去做将 Storyboard、UI 的更新动作停止的相关动作,例如下面这边以一个 Timer 为例子,在这个事件中会进行关闭的动作

void root_Obscured(object sender, ObscuredEventArgs e)

        {

            Debug.WriteLine("Unobscured");

            if (e.IsLocked)

            {

                //當應用程式被Lock screen覆蓋時要處理的動作,停止動畫(storyboard)、UI更新等動作

                timer.Stop();

            }

        }

在设备进入锁定时,能够把一些不需要用到的部分关闭,以节省电源。

看完了关闭之后,那如果要重新把闲置状态侦测给开启呢?设定回 Enable 就可以了?这个动作没有错,但是目前的 Windows Phone 7 版本尚未支持,目前闲置模式关闭之后,要重启的唯一方式就是整个应用程序必须要重新开启才行,这部分要特别留意。而 MSDN 中有提到,建议还是可以在应用程序中加入相关的程序代码,但同时要做错误处理,例如说

private void SetAppIdleDetectionEnable()

        {

            if (PhoneApplicationService.Current.ApplicationIdleDetectionMode != IdleDetectionMode.Enabled)

            {

                try

                {

                    PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Enabled;

                }

                catch (InvalidOperationException ex)

                {

                    //platform not souported

                    MessageBox.Show("Can't enable application idledection");

                }

            }

        }

这样在未来的更新中,系统支持上来之后,你的应用程序功能就可以立刻的正常运作了。

 UserIdleDetectionMode 部分:

这个部分是侦测使用者闲置的状态,使用的方式跟刚刚 ApplicationIdleDetection 是极其类似的,主要的差异性如下:

  • 以目前来说,使用者闲置是指『当用户没有触碰屏幕操作,或是点选硬件按键时』,Sensor 的部分目前即使有改变(例如说转向等等),也是视为闲置中,这个部分在未来的更新中可能会有变更
  • 当设定为 Disable 时,装置永远不会进入锁定
  • UserIdleDetectionMode 是支持 Disable 以及 Enable 的

关闭:

private void SetUserIdleDetectionDisable()

        {

            PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;

        }

重启:

private void SetUserIdleDetectionEnable()

        {

            if (PhoneApplicationService.Current.UserIdleDetectionMode != IdleDetectionMode.Enabled)

            {

                try

                {

                    PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Enabled;

                }

                catch (Exception ex)

                {

                    //platform not souported

                    MessageBox.Show("Can't enable user idledection");

                }

            }

        }

这样便可以达到停止闲置状态的侦测,这对于一些单纯利用 Sensor 来进行操作的应用程序是相当有用的。

你可能感兴趣的:(生命周期)