0

ユーザーがアプリを離れたときにライブ タイルを更新したいアプリがあります。最初の質問は、これが悪い考えかどうかです。ユーザーがアプリを 1 日に 20 回起動すると、これは悪い考えでしょうか、それとも何らかの形でバックグラウンド サービスに影響を与えるでしょうか?

2 番目の質問は、これがどれくらいの時間またはリソースを集中的に使用するかについて制限があるかどうかです。このコードを OnNavigatedFrom に入れると思いますが、ライブ タイルの更新に時間がかかりすぎる場合、OS はアプリを強制終了しますか? 画像を作成し、それを分離ストレージに保存し、画像を読み取り、タイルを更新する必要があります。

これに関するあなたからの考えを本当に楽しみにしています。

EDIT 1:私が尋ねる理由は、上記のようにすればうまくいくからです。しかし、アプリを起動してすぐに終了すると、背景画像のあるタイルではなく、黒いタイルしか表示されません。だから、コードが終わっていないという印象を受けます。どうすればそれを回避できますか?

編集 2: ライブ タイルを動的に作成しているので、背景画像の読み込みに問題があると思います。背景画像を読み込んで、それにテキストを追加します。タイルが黒くなってもテキストが表示されるので、タイルの背景として使用される背景画像の読み込みに何かがあるはずです。

編集 3:背景画像として使用される画像を作成するための完全なコードを次に示します。コードを減らすために少し単純化しようとしました。

Grid grid = new Grid();

StackPanel sp = new StackPanel();
sp.Height = 173;
sp.Width = 173;

sp.Background = (SolidColorBrush)Application.Current.Resources["PhoneAccentBrush"];
strBackBackground = "";

StreamResourceInfo info;

sp.Background = (SolidColorBrush)Application.Current.Resources["PhoneAccentBrush"];
strBackBackground = "";
info = Application.GetResourceStream(new Uri("/MyApp;component/images/Icons/livetile/metro-" + strSymbol + ".png", UriKind.Relative));

// create source bitmap for Image control (image is assumed to be alread 173x173)
WriteableBitmap wbmp3 = new WriteableBitmap(1, 1);
try
{
    wbmp3.SetSource(info.Stream);
}
catch
{
}

Image img3 = new Image();
img3.Source = wbmp3;
// add Image to Grid
img3.Width = 173;
img3.Height = 173;
img3.Margin = new Thickness { Left = 0, Bottom = 0, Right = 0, Top = 0 };

TextBlock txtTemperature = new TextBlock();
TextBlock txtTemperatureRing = new TextBlock();

txtTemperature.Foreground = new SolidColorBrush(Colors.White);
txtTemperature.Text = strTemp;
txtTemperature.TextAlignment = TextAlignment.Right;
txtTemperatureRing.Style = (Style)Application.Current.Resources["PhoneTextTitle3Style"];
txtTemperatureRing.FontFamily = new FontFamily("Segoe WP Light");
txtTemperatureRing.FontSize = 40;
txtTemperatureRing.Foreground = new SolidColorBrush(Colors.White);
txtTemperatureRing.Text = "°";
txtTemperatureRing.TextAlignment = TextAlignment.Right;

txtTemperature.FontFamily = new FontFamily("Segoe WP");
txtTemperature.FontSize = 40;
txtTemperature.Margin = new Thickness { Left = 0, Bottom = 0, Right = 0, Top = -55 };
txtTemperature.Height = 80;
txtTemperature.Width = 135;
txtTemperatureRing.Margin = new Thickness { Left = 130, Bottom = 0, Right = 0, Top = -112 };
txtTemperatureRing.Height = 50;
txtTemperatureRing.Width = 29;

sp.Children.Add(img3);
sp.Children.Add(txtTemperature);
sp.Children.Add(txtTemperatureRing);

//call measure, arrange and updatelayout to prepare for rendering
sp.Measure(new Size(173, 173));
sp.Arrange(new Rect(0, 0, 173, 173));
sp.UpdateLayout();
grid.Children.Add(sp);

WriteableBitmap wbmp = new WriteableBitmap(173, 173);
wbmp.Render(grid, null);
wbmp.Invalidate();

//write image to isolated storage
string sIsoStorePath = @"\Shared\ShellContent\tile.png";
using (IsolatedStorageFile appStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
    //ensure directory exists
    String sDirectory = System.IO.Path.GetDirectoryName(sIsoStorePath);
    if (!appStorage.DirectoryExists(sDirectory))
    {
        appStorage.CreateDirectory(sDirectory);
    }

    using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(sIsoStorePath, System.IO.FileMode.Create, appStorage))
    {
        wbmp.SaveJpeg(stream, 173, 173, 0, 100);
    }
}


/// If application uses both PeriodicTask and ResourceIntensiveTask
if (task is PeriodicTask)
{

    ShellTile TileToFind = ShellTile.ActiveTiles.First();


    if (TileToFind != null)
    {
        StandardTileData NewTileData = new StandardTileData
        {
            BackgroundImage = new Uri("isostore:Shared/ShellContent/tile.png", UriKind.Absolute),
            Title = strTitle,
            Count = null,
            BackTitle = (string)settings["SelectedCityName"],
            BackBackgroundImage = new Uri(strBackBackground, UriKind.Relative),
            BackContent = strWind + Environment.NewLine + strPrecipitation
        };

        TileToFind.Update(NewTileData);
    }
}
4

4 に答える 4

1

あなたの問題を回避する方法があります。

ユーザーは「戻る」ボタンを使用してアプリを閉じていますよね? したがって、これを利用できます。

このイベントにメソッドを追加するだけで、アプリを閉じる前に完全に実行する必要があります。MainPage() メソッドで次のように入力します。

this.BackKeyPress += new EventHandler<System.ComponentModel.CancelEventArgs>((sender, e) =>
{
    blablablablabla - your code;
});
于 2012-05-04T17:58:29.057 に答える
0

アプリケーションが非アクティブ化されたときに処理を完了する必要がある正確な期間に関する明確なガイドラインはありません。技術認定要件のセクション5.2を見ると、アプリケーションを終了/再起動するときの応答性の制限時間に関するいくつかのシナリオが示されています(5秒以内に起動する必要があり、20秒で使用可能)。これらの要件に従わないと、アプリケーションの認定が妨げられる可能性があります。コードが特定の期間内にシャットダウンされない場合にコードを終了するウォッチドッグプロセスもあります(申し訳ありませんが、ここで正確な数を見つけることができません)。起動ページのコンストラクターに意図的に長時間実行されるタスク(またはさらには)を配置すると、これが実際に動作していることがわかります。Thread.Sleep()

ローカルでイメージを作成している場合(つまり、ネットワークコールがない場合)、複雑なイメージでない限り、目的の処理を実行するのに十分な時間が必要です。アプリケーションにも同様の要件がありますが、画像をフェッチするにはネットワーク呼び出しが必要です。その結果、アプリケーションの起動時に更新タスクを起動するので、アプリケーションの読み込み中に画像の取得を開始し、ユーザーがアプリケーションに気を取られている間、サイレントに更新できます。

すぐに終了すると画像が黒くなることに関して、これはスプラッシュ画面がまだ表示されている間ですか?最初のページのコンストラクターがまだ表示されていない場合、ウォッチドッグの動作は少し異なると思います。

于 2012-03-08T11:09:10.430 に答える
0

Application_Launching でタイルを更新してみてください。

Application_Activated で更新すると、スタート メニューとメイン パノラマの間をすばやく切り替えたときに黒い画面が表示されるはずです。Application_Closing/Application_Deactivated で更新しても機能しません

于 2012-03-16T08:20:51.713 に答える
0

原則として、アプリを終了するときに何かをすることは悪い考えです。アプリの一般的な操作の中で、代わりにこれを行うことができる別のポイント (またはポイント) を見つけることができますか?

タイルを更新する方法については言及していませんが、自分で画像をダウンロードしている場合は、アプリを終了するときにこれを行うことができない可能性が非常に高くなります. また、画像を取得するための非同期リクエストは、応答を待っている間、アプリの終了をブロックしないため、リクエストが中止される可能性があります。応答を待っている間にアプリの終了をブロックしようとするのは非常に悪い考えであり、数秒以上かかると、アプリのプロセスが OS によって強制終了される可能性があります。

于 2012-03-08T11:18:48.873 に答える