アイドル状態の検出
|電源キーの押下などの操作で端末がロック状態になるとアプリケーションはアイドル状態に移行します。
端末がアイドル状態に移行するとOSは端末の消費電力を抑えるために、アプリケーションのメインタスクの終了が実行されます。
しかし、アイドル中でも処理を続行したい場合はアイドルの検出モードを無効化する必要があります。
今回はこのアイドル状態の制御や検出の無効化について紹介します。
詳細は以下から。
アイドル検出モード
アイドル状態は検出モードを切り替えることにより、アプリケーションがアイドル状態になることを無効化することができます。
検出モードの無効化はPhoneApplicationServiceオブジェクトのApplicationIdleDetectionModeプロパティをDisabledに設定することで可能になります。
PhoneApplicationServiceオブジェクトを使用するにはusingディレクティブにMicrosoft.Phone.Shellを追加する必要があります。
App.xaml.cs
PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
ただし、アイドル状態の検出を無効化している場合でもバッテリー残量などの関係でアプリケーションがアイドル状態になってしまう場合があります。
基本的にはアイドル状態の検出を無効化を行うことは推奨されていません。
アイドル状態の検出を有効化している場合は、アイドル状態遷移時にアプリケーションが休止状態になったのと同じ挙動を行いますが、無効化するとこの一連の制御を自分自身で実装する必要があるためです。
アイドル状態の検出を無効化した場合の必須実装処理
アイドル状態の検出を無効にした場合にはPhoneApplicationFrameオブジェクトのObscuredイベントを実装する必要があります。
App.xaml.cs
public App() { // ~省略~ RootFrame.Obscured += RootFrame_Obscured; } private void RootFrame_Obscured(object sender, EventArgs e) { // アイドル検出の無効化時に必須の処理を入れる }
更に、このイベント内に以下の処理を入れる必要があります。
- System.Threading.Timer.DisposeおよびDispatcherTimer.Stopを使用して、すべてのアクティブなタイマーを停止する。
- Storyboard.PauseまたはStoryboard.Stopを呼び出してすべてのアニメーションを停止する。
- Stop()を呼び出して加速度計を停止させる。(Stopメソッドの詳細はこちら)
- Stop()を呼び出して位置情報サービスを停止させる。(Stopメソッドの詳細はこちら)
- PowerModeプロパティをOffに設定して、FMラジオをオフにする。
- 分散ストレージやネットワークへのアクセスを行うスレッドを停止させる。
これらの処理を実装していない場合はアプリケーションの電池消費量が増加するだけでなく、端末のハードウェアが使用できなくなってしまう可能性があります。(端末の再起動で回復します。)
ロック画面からの復旧処理に関してはUnobscuredイベントを実装します。このイベントは、ロック画面が解除されると発生します。
App.xaml.cs
public App() { // ~省略~ RootFrame.Unobscured += RootFrame_Unobscured; } private void RootFrame_Unobscured(object sender, EventArgs e) { // ロック画面からの復旧処理を入れる }
これら以外の注意点として以下のことが挙げられます。
- MediaElementオブジェクトを使用している場合は、ObscuredイベントSourceプロパティをnullに設定し、Unobscuredイベントで前の値を復元して、ロック画面になっている間にMediaElementがリソースを消費しないようにする必要があります。(MediaElementについてはこちらを参考にしてください。)
- ロック画面になっている間、加速度センサーはデータを返しません。
- アイドル状態検出を無効化する場合は電池の消耗が増加するため、ユーザーへの確認を入れておく方が良いでしょう。ユーザーの意図しない動作によってバッテリーの消費が増加するとアプリケーションに悪いイメージを持たれる可能性があります。