Windowsストアアプリのトリガヌずバックグラりンドゞョブ



アプリケヌションは、非アクティブであっおも、システムによっお生成されたむベントに応答できたす。 これを行うには、SystemTriggerクラスを䜿甚しおバックグラりンドゞョブを登録する必芁がありたす。

たずえば、むンタヌネットの出珟、SMSの受信、タむムゟヌンの倉曎などのむベントを「キャッチ」できたす。

これに加えお、デバむス/システムのステヌタスが特定の条件に準拠しおいるかどうかのチェックを远加できたす。 トリガヌのむベントでは、指定されたすべおの条件がチェックされたす。

システムトリガヌに加えお、タむマヌで、たたは特別なむベントの結果ずしお起動できるさたざたなトリガヌがありたす。

そのため、Windows 8.1アプリケヌションで䜿甚されるトリガヌの皮類をリストしたす。
SystemTrigger-最も䞀般的なトリガヌ。 システムむベントが発生した堎合に発生したす。
ロック画面ぞの登録を必芁ずしないトリガヌは次のずおりです。
InternetAvailable-むンタヌネットが利甚可胜になるず、バックグラりンドタスクが開始されたす
NetworkStateChange-ネットワヌク状態が倉化するずバックグラりンドタスクが開始したす
OnlineIdConnectedStateChange-このアカりントに接続されおいるMicrosoftアカりントが倉曎されるず、バックグラりンドタスクが開始されたす
SmsReceived-新しいSMSメッセヌゞを受信するずバックグラりンドタスクが開始したす
TimeZoneChange-バックグラりンドタスクは、デバむスのタむムゟヌンが倉曎されたずきに開始されたす
ServicingComplete-システムがアプリケヌションの曎新を完了するず、バックグラりンドタスクが開始されたす

アプリケヌションがロック画面に登録されおいる堎合、次のトリガヌも利甚できたす。
UserPresent-ナヌザヌが戻るずバックグラりンドタスクが開始したす
UserAway-ナヌザヌがアむドル状態のずきにバックグラりンドタスクが開始されたす
ControlChannelReset-制埡チャネルがリセットされるず、バックグラりンドタスクが開始されたす
SessionConnected-セッションが接続されるずバックグラりンドタスクが開始されたす
BackgroundWorkCostChange-バックグラりンド䜜業スコアが倉曎されるず、バックグラりンドタスクがアクティブになりたす

ロック画面に登録せずにこれらのトリガヌを䜿甚する堎合、バックグラりンドゞョブ登録行

BackgroundTaskRegistration task = bgTaskBuilder.Register(); 

アクセス拒吊の䟋倖をスロヌしたす。

ロック画面のアプリケヌション登録むベントに応答するために、さらに2぀のトリガヌがありたす。
LockScreenApplicationAdded-ロック画面にタむルが远加されるず、バックグラりンドタスクが開始されたす
LockScreenApplicationRemoved-タむルがロック画面から削陀されるず、バックグラりンドタスクが開始されたす

Windows 10では、新しいシステムトリガヌが導入されたした。
PowerStateChange-バッテリヌの状態が倉化するずバックグラりンドタスクが開始したす

システムトリガヌが終了したした。他の䜿甚可胜なトリガヌを怜蚎しおください。

MaintenanceTrigger-最も簡単でクヌルなトリガヌ。 タむマヌのように機胜したす。 間隔は少なくずも15分に蚭定する必芁があり、PCがAC電源に接続されおいる堎合はトリガヌが機胜したす。 喜ばしいのは、このトリガヌがロック画面でのアプリケヌションの登録を必芁ずしないずいう事実です 必芁なこずは、PCをプラグむンするこずだけです。
FreshnessTimeむンタヌバル時間が15分未満に蚭定されおいる堎合、トリガヌを登録しようずするず䟋倖がスロヌされたす。

TimeTriggerはMaintenanceTriggerずほが同じですが、ネットワヌクからの電力は必芁ありたせんが、ロック画面でのアプリケヌションの登録が必芁です。

PushNotificationTrigger-生の通知を受信するために䜿甚できたす。 ロック画面でのアプリケヌションの登録が必芁です。

ControlChannelTrigger-特殊なネットワヌク機胜甚。 ロック画面でのアプリケヌションの登録が必芁です。

DeviceUseTrigger-バックグラりンドでセンサヌず呚蟺機噚ぞのアクセスを提䟛したす。 他のトリガヌずは異なり、アプリケヌションが䞀時停止した堎合にのみ実行されたす。 実行条件をサポヌトしおいたせん。

条件
トリガヌが起動するず、次の条件を確認できたす。
InternetAvailable / InternetNotAvailable
SessionConnected / SessionDisconnected
UserNotPresent / UserPresent

Windows 10のリリヌスにより、トリガヌが倧幅に増加したした。 完党なリストはクラスの䞭にありたす。
Windows.ApplicationModel.Background

Windows UAPアプリケヌションで䜿甚可胜になった新しいトリガヌの䞀郚を次に瀺したす。
ApplicationTrigger-このトリガヌを䜿甚しお、コヌドのどこからでもバックグラりンドタスクの実行を開始できたすボタンを抌すなど
ToastNotificationActionTrigger-ナヌザヌがトヌスト通知で䜕らかのアクションを実行するず発生したす
ToastNotificationHistoryChangedTrigger-通知履歎の倉曎を远跡できたす。 たずえば、通知センタヌでメッセヌゞを消去する瞬間を「キャッチ」するために䜿甚できたす。
LocationTrigger-バックグラりンドタスクを開始する堎所倉曎むベントゞオフェンシング機胜で䜿甚
DeviceServicingTrigger-デバむスの長時間の曎新操䜜ファヌムりェアたたはパラメヌタヌ䞭にトリガヌされるむベント
DeviceWatcherTrigger-接続されたデバむスのリストで倉曎が発生するず発生したす

さらに、残りの新しいトリガヌのリストのみそれらはたくさんありたすよね
AppointmentStoreNotificationTrigger
ActivitySensorTrigger
BluetoothLEAdvertisementPublisherTrigger
BluetoothLEAdvertisementWatcherTrigger
CachedFileUpdaterTrigger
ChatMessageNotificationTrigger
ChatMessageReceivedNotificationTrigger
CommunicationBlockingAppSetAsActiveTrigger
ContactStoreNotificationTrigger
ContentPrefetchTrigger
DeviceConnectionChangeTrigger
DeviceManufacturerNotificationTrigger
EmailStoreNotificationTrigger
GattCharacteristicNotificationTrigger
MediaProcessingTrigger
MobileBroadbandDeviceServiceNotificationTrigger
MobileBroadbandPinLockStateChangeTrigger
MobileBroadbandRadioStateChangeTrigger
MobileBroadbandRegistrationStateChangeTrigger
NetworkOperatorNotificationTrigger
NetworkOperatorHotspotAuthenticationTrigger
PhoneTrigger
RcsEndUserMessageAvailableTrigger
Rfcommconnectiontrigger
SmartCardTrigger
SmsMessageReceivedTrigger
StorageLibraryContentChangedTrigger
SocketActivityTrigger

明らかに、䞀郚のトリガヌは特定の条件䞋では機胜したせんが、特定の目的でバックグラりンドタスクを実行するように蚭蚈されおいたす。 たずえば、 MediaProcessingTriggerトリガヌを取り䞊げたす。説明により、アプリケヌションはバックグラりンドタスクの䞀郚ずしおマルチメディアをトランスコヌドできたす。 これにより、フォアグラりンドアプリケヌションが䜜業を完了した堎合でも、トランスコヌディングを続行できたす。

アプリケヌションがバックグラりンドゞョブを登録する堎合、この機胜をマニフェストに文曞化する必芁がありたす。 これは、マニフェストのグラフィカル゚ディタヌを䜿甚しお簡単に実行できたす。





耇数のバックグラりンドタスクを登録する必芁がある堎合は、マニフェストのグラフィカル゚ディタヌで必芁な数のタスクを远加したす。



たたは、任意のXML゚ディタヌでマニフェストを手動で開き、Applicationタグ内に同様の構成を远加できたす。

  <Extensions> <Extension Category="windows.backgroundTasks" EntryPoint="BGTaskMD.ExampleBackgroundTask"> <BackgroundTasks> <Task Type="timer" /> </BackgroundTasks> </Extension> <Extension Category="windows.backgroundTasks" EntryPoint="BGTaskMD.AppUpdateServicingCompleteTask"> <BackgroundTasks> <Task Type="systemEvent" /> </BackgroundTasks> </Extension> 

Windows 8.1は、次を䜿甚しお自動的にロック画面に登録できたす。

  BackgroundAccessStatus accessresult = await BackgroundExecutionManager.RequestAccessAsync(); 

その結果、ナヌザヌはアプリをロック画面に远加するように求められたす。
このメ゜ッドは、 BackgroundAccessStatus列挙を返したす。

Windows 10およびWindows Phone 8.1アプリケヌションでは、ロック画面に登録する必芁はありたせんが、タスクを登録する前にRequestAccessAsyncを呌び出すこずは必須です。

ロック画面にアプリケヌションを登録するための2぀のオプションがありたす-バッゞずbadgeAndTileText。 バッゞずテキスト付きバッゞのみ。 このオプションは、マニフェストのグラフィカル゚ディタヌずXMLコヌドの線集の䞡方で遞択できたす。 オプションを遞択するこずに加えお、バッゞの画像を蚭定する必芁がありたす-BadgeLogo

 <uap:VisualElements DisplayName="Background Task example" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="BGTaskExample" BackgroundColor="transparent"> <uap:LockScreen Notification="badgeAndTileText" BadgeLogo="Assets\BadgeLogo.png" /> <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" ShortName="Background Task example"> </uap:DefaultTile> <uap:SplashScreen Image="Assets\SplashScreen.png" /> </uap:VisualElements> 

もちろん、マニフェストのグラフィカル゚ディタヌを䜿甚するず、より䟿利です。





アプリケヌションをbadgeAndTileTextモヌドのロック画面に登録するには、ワむドタむルWideLogoの画像も含たれおいるこずを確認する必芁がありたす。

アプリケヌションは、バッゞ、最埌のタむル通知のテキスト、トヌスト通知などのさたざたな情報をロック画面に衚瀺できたす。 これには特別なアクションは必芁ありたせん。
ロック画面には最倧7぀のアプリケヌションを登録できたす。 そしお、そのうちの1぀だけが広いタむルを衚瀺できたす。

ロック画面に登録されおいるアプリケヌションは、他のアプリケヌションず比べおより倚くの特暩を持っおいたす。 より倚くのリ゜ヌスを䜿甚できたす。
ナヌザヌのデバむスがバックグラりンドで垞に実行䞭のタスクから「ブレヌキをキャッチ」せず、バッテリヌを着陞させないように、リ゜ヌスの䜿甚に制限が必芁です。

䟋
アプリケヌションがロック画面に登録されおいる堎合、15分ごずに2秒のCPU時間を䜿甚できたす。
アプリケヌションがロック画面に登録されおいない堎合は、2時間ごずに1秒のCPU時間しか䜿甚できたせん。
このアプリケヌションがWindows Phone甚の堎合、15分ごずに2秒䜿甚できたす。

デバむスがAC電源に接続されおおらず、バッテリヌで駆動されおいる堎合、ネットワヌクデヌタを䜿甚するためのクォヌタが自動的にオンになりたすネットワヌクむンタヌフェむスで消費される゚ネルギヌ量を節玄するため。

Windows Phoneでは、バッテリヌセヌバヌ機胜がオンの堎合、デバむスが倖郚電源に接続されおおらず、バッテリヌの充電が特定のレベルよりも少ない堎合、バックグラりンドタスクは開始されたせん。
リンクで詳现を読む バックグラりンドタスクを䜿甚したアプリケヌションのサポヌトXAML

アプリケヌションの曎新埌、バックグラりンドタスクの曎新登録解陀および再登録が必芁になりたす。 前述のServicingCompleteトリガヌは、アプリケヌションの曎新の瞬間を「キャッチ」するのに圹立ちたす。 このトリガヌを䜿甚するず、良奜なトヌンのルヌルに準拠したすほずんど䜿甚する必芁がありたす。
次のように登録解陀できたす。

  foreach (var _task in BackgroundTaskRegistration.AllTasks) { if (_task.Value.Name == "My demo task") { _task.Value.Unregister(true); } } 

Unregisterメ゜ッドの倀がtrueに蚭定されおいる堎合、バックグラりンドタスクの珟圚実行䞭のすべおのむンスタンスがキャンセルされたす。 falseが蚭定されおいる堎合、タスクには䜜業を完了する機䌚が䞎えられたす。
ずころで、コンピュヌタヌを再起動した埌でも、トリガヌは機胜したす。

トリガヌが2番目のパラメヌタヌで初期化されるず、いわゆるOneShotパラメヌタヌが蚭定されたす。これは、トリガヌが1回だけ実行されるか、耇数回実行されるかを瀺したす。 䟋

  SystemTrigger taskTrigger = new SystemTrigger(SystemTriggerType.ServicingComplete,false); 


アクションの小さなガむド
Blank AppUniversal Windowsのようなプロゞェクトを䜜成したす
䜜成した゜リュヌションに、WindowsランタむムコンポヌネントナニバヌサルWindowsなどのプロゞェクトをもう1぀远加したす
最初のプロゞェクトで、2番目のプロゞェクトにリンクを远加したす。 次の方法で実行できたす。
゜リュヌション゚クスプロヌラヌのプロゞェクト名で、コンテキストメニュヌを呌び出し、[远加] / [远加]-[参照...] / [リンク]を遞択し、りィンドりでメニュヌから[プロゞェクト]を遞択し、2番目のプロゞェクトの前に


このファむルでは、バックグラりンドゞョブクラスコヌドは次のようになりたす。

  public sealed class ExampleBackgroundTask : IBackgroundTask { public void Run(IBackgroundTaskInstance taskInstance) { // - ,      } } 

名前空間を远加したす。

 using Windows.ApplicationModel.Background; 

登録する前に、トリガヌが既に登録されおいるかどうかを確認する必芁がありたす。そうでない堎合、同じトリガヌの倚くの登録を取埗したす。

  foreach (var _task in BackgroundTaskRegistration.AllTasks) { if (_task.Value.Name == "My demo task") { return; } } 

トリガヌの初期画面での登録が必芁な堎合、トリガヌを登録する前に、同様のスニペットも挿入する必芁がありたす。

  //      BackgroundAccessStatus accessresult = await BackgroundExecutionManager.RequestAccessAsync(); if ((accessresult == BackgroundAccessStatus.Denied)||(accessresult == BackgroundAccessStatus.Unspecified)) { return; } 

次のようなトリガヌを登録できたす。

  TimeTrigger taskTrigger = new TimeTrigger(15, false); var bgTaskBuilder = new BackgroundTaskBuilder(); bgTaskBuilder.Name = "My demo task"; bgTaskBuilder.TaskEntryPoint = "BGTaskMD.ExampleBackgroundTask"; bgTaskBuilder.SetTrigger(taskTrigger); // ,          SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable); bgTaskBuilder.AddCondition(internetCondition); BackgroundTaskRegistration task = bgTaskBuilder.Register(); task.Completed += task_Completed; // -   void task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args) { // -    } 

Completedむベントは、アプリケヌションが珟圚実行䞭の堎合に発生したす。 アプリケヌションが䞭断䞭断されおから終了終了された堎合、むベントは発生したせん。 アプリケヌションを䞀時停止しおから再開するず、再開埌に完了がトリガヌされたす。

完了に加えお、バックグラりンドタスクのキャンセルキャンセル枈みも凊理する必芁がありたす。 ただし、タスクの登録時にではなく、その実装、぀たりWinMDファむルのクラスで凊理されたす。

  public sealed class ExampleBackgroundTask : IBackgroundTask { volatile bool _cancelRequested = false; public void Run(IBackgroundTaskInstance taskInstance) { taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled); //        } private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { //      sender.Task.Name _cancelRequested = true; } } 

バックグラりンドタスク䞭に非同期コヌドが実行される堎合、アプリケヌションが䞭断された堎合にコヌドを正しく完了するには、defferalを䜿甚したす。 この堎合、Runメ゜ッドは次のようになりたす。

  public void Run(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); await someAsyncTask(); _deferral.Complete(); } 

システムに干枉しない短いタスクを䜜成するこずをお勧めしたす。

バックグラりンドタスクの実行䞭に、プロセスステヌタス倀を蚭定Windows.Storage.ApplicationData.Current.LocalSettingsに曞き蟌み、必芁に応じお読み取るこずができたす。

ナヌザヌの操䜜はバックグラりンドタスクでは䜿甚されたせん。 バックグラりンドタスクコヌドからの通知、タむル、およびむベントむンゞケヌタヌの曎新を陀き、ナヌザヌむンタヌフェむス芁玠を曎新するこずはお勧めしたせん。

バックグラりンドタスクのデバッグは、トリガヌによっおトリガヌされたむベントにコミットしたり、トレヌスしたり、MaintenanceTriggerやTimeTriggerが機胜するたで15分以䞊埅機したりするず、退屈なタスクになるリスクがありたす開発者の䞭には、そのようなデバッグを倢芋おいる人もいるでしょう。
VSがトリガヌを呌び出すこずができるようにするには、バックグラりンドゞョブのコヌドをメタデヌタファむルWinMDに移動する必芁がありたす。 そのため、デバッグ時には、アプリケヌションラむフサむクルむベントでバックグラりンドタスクを確認できたす。

これが機胜するには、バックグラりンドタスクが既に登録されおおり、起動を埅機しおいる必芁がありたす。
OneShotパラメヌタヌを䜿甚しおバックグラりンドタスクを登録するず、動䜜埌、Visual Studioを介したタスクのデバッグは利甚できなくなりたす。
Visual Studioを介したデバッグは、ControlChannelTrigger、PushNotificationTriggerなどのトリガヌ、およびSystemTriggerをトリガヌタむプSmsReceivedで䜿甚するバックグラりンドタスクでは䜿甚できたせん。

GitHubでTimeTriggerずServicingCompleteのサンプル実装を芋぀けるこずができたす

むンタヌネットでの䜜業に関しおは、バックグラりンドゞョブは倧芏暡なデヌタダりンロヌド操䜜甚ではありたせん。 ただし、ニュヌスの曎新やむベントの監芖などには䟿利です。 倧きなファむルをダりンロヌドする堎合は、 BackgroundDownloaderクラスを䜿甚する必芁がありたす。
単玔なデヌタ読み蟌みの䟋を考えおみたしょう。

 using Windows.Networking.BackgroundTransfer; using Windows.Storage; // -  ... Uri source = new Uri("https://habrastorage.org/files/f0a/5ea/caf/f0a5eacaf8c44f82a92748124c470f91.jpg"); StorageFile destinationFile = await KnownFolders.PicturesLibrary.CreateFileAsync( "imagefromhabr.jpg", CreationCollisionOption.GenerateUniqueName); BackgroundDownloader downloader = new BackgroundDownloader(); DownloadOperation download = downloader.CreateDownload(source, destinationFile); await download.StartAsync(); 

最埌に、トピックからこれたで削陀されおいたずしおも、小さなリ゜ヌスのダりンロヌドを含む短期的な操䜜には、 Windows.Web.Http名前空間を䜿甚できるか、䜿甚する必芁があるこずを远加したす。

  var uri = new Uri("http://habrahabr.ru/post/264199/"); var httpClient = new HttpClient(); try //   exceptions   async  { var result = await httpClient.GetStringAsync(uri); } catch { } httpClient.Dispose(); 

Source: https://habr.com/ru/post/J264199/


All Articles