はい(「バックグラウンドエージェント」、http: //www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/を検索してください)。
そこから始めて、アプリの仕様に関連するより独立した調査を実行する必要があります。
ジェフの記事によると:
Visual Studioを起動し、新しいプロジェクトを作成します。[Silverlight for Windows Phone]で、[WindowsPhoneアプリケーション]を選択します。「MyAgentApp」という名前を付けます。
これでメインアプリケーションが作成されました。それは2つのことに責任があります:
1)バックグラウンドエージェントが情報で更新できるライブタイルを用意する
2)バックグラウンドエージェントの開始と停止
バックグラウンドエージェント自体は、独自の特別なプロジェクトに存在する必要があります。ソリューションに新しいプロジェクトを追加し、WindowsPhoneのスケジュールされたタスクエージェントを選択します。MyAgentという名前を付けます。このプロジェクトには、バックグラウンドで実行され、ライブタイルを更新するカスタムコードが含まれます。
最後に、これは重要です。MyAgentAppプロジェクトに移動し、プロジェクト参照をMyAgentに追加します。これにより、アプリケーション内からエージェントを登録できるようになります。また、これがWMAppManifest.xmlに自動的に作成されたエントリに注意してください。
<Tasks>
<DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyAgent" Source="MyAgent" Type="MyAgent.ScheduledAgent" />
</ExtendedTask>
</Tasks>
次に、実際にすべてを配線します。MainPage.xamlを開き、2つのボタンを追加します。1つはエージェントを開始するためのもので、もう1つはエージェントを停止するためのものです。
<StackPanel VerticalAlignment="Center">
<Button Content="Start Background Agent"
Click="StartButton_Click"/>
<Button Content="Stop Background Agent"
Click="StopButton_Click"/>
</StackPanel>
MainPage.xaml.csで、エージェントを開始および停止するためのボタンを配線します。
private const string TASK_NAME = "MyAgent";
private void StartButton_Click(object sender, RoutedEventArgs e)
{
StartAgent();
}
private void StopButton_Click(object sender, RoutedEventArgs e)
{
StopAgentIfStarted();
}
private void StartAgent()
{
StopAgentIfStarted();
PeriodicTask task = new PeriodicTask(TASK_NAME);
task.Description = "This is our custom agent for Day 25 - Background Agents";
ScheduledActionService.Add(task);
#if DEBUG
// If we're debugging, attempt to start the task immediately
ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));
#endif
}
private void StopAgentIfStarted()
{
if (ScheduledActionService.Find(TASK_NAME) != null)
{
ScheduledActionService.Remove(TASK_NAME);
}
}
カスタムエージェントを作成するために、新しいPeriodicTaskを作成していることに注意してください。次に、エージェントを見つけて停止するときに、その名前を識別子として使用します。また、PeriodicTask.Descriptionを指定したことにも注意してください。これは必須フィールドであり、[設定]|[設定]に表示されます。アプリケーションの名前でのバックグラウンドタスク。
MyAgentプロジェクトで、ScheduledAgent.csを開き、次のコードを追加します。
protected override void OnInvoke(ScheduledTask task)
{
UpdateAppTile(GetLastUpdatedTimeMessage());
}
private string GetLastUpdatedTimeMessage()
{
return string.Format("Last Updated: {0}", DateTime.Now);
}
private void UpdateAppTile(string message)
{
ShellTile appTile = ShellTile.ActiveTiles.First();
if (appTile != null)
{
StandardTileData tileData = new StandardTileData
{
BackContent = message
};
appTile.Update(tileData);
}
}
ScheduledAgentには、オーバーライドする重要なメソッドが1つあります。OnInvokeです。これは、エージェントがバックグラウンドタスクを実行する場所です。タスクが完了し、エージェントを実行する必要がなくなった場合は、NotifyComplete()を呼び出してタスクが正常に完了したことを通知するか、Abort()を呼び出してタスクをキャンセルすることを通知できます。タスクを一定の間隔で実行し続けるには、どちらも呼び出さないでください。これは、ここで行っていることです。