多くの Web サービス呼び出しを含むアプリを作成しています。フローを改善し、おそらく起動時間に関する Windows ストアの要件を満たすために、拡張スプラッシュ スクリーンを使用してすべてのメイン データをロードし、このデータをさまざまなデバイス間で共有することにしました。 App.xaml.cs で定義したグローバル変数を使用するページ。
私の質問は: このようにグローバル変数を使用することは正しいですか? アプリが一時停止/再開されたときにこのデータが失われるリスクはありますか?
以下は私のコードです
app.xaml.cs ページのコードを次に示します。ここでは、グローバル変数を定義し、拡張スプラッシュ スクリーンに移動する前に、Web サービスからアプリの背景画像を読み込みます。
sealed partial class App : Application
{
**public string[] NavigateData { get; set; }
public NavigationCacheMode NavigationCacheMode { get; set; }**
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
//Cache the page
this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}
protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
Frame rootFrame = Window.Current.Content as Frame;
//---------------------------------Live tile
var uris = new List<Uri>
{
new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetFirstTile"),
new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetSecondTile"),
new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetStatisticTile"),
new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile1"),
new Uri("http://XXX.XX.XX.XXX/WebApi/WebService.asmx/GetNewsTile2"),
};
TileUpdater LiveTileUpdater = TileUpdateManager.CreateTileUpdaterForApplication();
LiveTileUpdater.EnableNotificationQueue(true); // Enable notifications
LiveTileUpdater.Clear(); // Clear the current set of updates
LiveTileUpdater.StartPeriodicUpdateBatch(uris, PeriodicUpdateRecurrence.HalfHour);
//------------------------------Live tile section end
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null)
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
weather.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");
//When the app is loaded first time it calls the web service to get wich background picture to use
//--------------------------Getting and setting background image for all the pages--------------------
string appBackgGround;
ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();
// Get the name of the Background picture
appBackgGround = await webServiceObj.GetBackgroundImageAsync();
// Her we set the application background Image for all pages "backgroundImageBlueSky.jpg"
rootFrame.Background = new ImageBrush
{
Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill,
ImageSource = new BitmapImage { UriSource = new Uri("ms-appx:///Assets/"+appBackgGround) }
};
//--------------------------Bacground image end--------------------
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
//TODO: Load state from previously suspended application
await weather.Common.SuspensionManager.RestoreAsync();
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (rootFrame.Content == null)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
//Go to the extended splash screen
if (!rootFrame.Navigate(typeof(ExtendedSplashScreen), rootFrame.GetNavigationState()))
{
throw new Exception("Failed to create initial page");
}
}
// Ensure the current window is active
//create the about page
var _Helper = new Flyouts.SettingsHelper();
_Helper.AddCommand<Flyouts.About>("About");
Window.Current.Activate();
}
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
//TODO: Save application state and stop any background activity
await weather.Common.SuspensionManager.SaveAsync();
deferral.Complete();
}
}
}
ExtendedSplashScreen:ここでは、メインページに移動する前に、Web サービスからアプリの初期化データを読み込みます。データは、App.xaml.cs で定義されたグローバル変数に保存されます。このデータのロード中は、進行状況リングが表示されます。データが読み込まれた後、メインページに移動します
public sealed partial class ExtendedSplashScreen : Page
{
parameterItem max1DayAgo = new parameterItem();
parameterItem min1DayAgo = new parameterItem();
public ExtendedSplashScreen()
{
this.InitializeComponent();
}
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
string[] periodSelector = { "1DayAgo", "1WeekAgo", "1MonthAgo" };
string[] modeSelector = { "max", "min" };
string[] parameterSelector = { "umtTemp1", "umtWindSpeed", "umtAdjBaromPress", "umtRainRate" };
//---------------GETTING WEBSERVICE DATA FOR STARTUP-------------
//Create a webservice object
ServiceReference.WebServiceSoapClient webServiceObj = new ServiceReference.WebServiceSoapClient();
var getMax1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[0]);
//create an object that holds min data for yesterday
var getMin1DayAgoObj = await webServiceObj.GetSelectedMaxMinDataAsync(parameterSelector, periodSelector[0], modeSelector[1]);
//Save arrayOfValue and arrayOfUnit to a parameterItem object. these objects are created during startup
// and the can be accessed and updated by all methods in this page later we will see that maxMinButton_Click method
//for the maxMinButton will use these data
max1DayAgo.arrayOfValue = getMax1DayAgoObj.arrayOfValue;
max1DayAgo.arrayOfUnit = getMax1DayAgoObj.arrayOfUnit;
min1DayAgo.arrayOfValue = getMin1DayAgoObj.arrayOfValue;
min1DayAgo.arrayOfUnit = getMin1DayAgoObj.arrayOfUnit;
string[] startupData = new string[13];
startupData[0] = " " + max1DayAgo.arrayOfValue[0] + " " + max1DayAgo.arrayOfUnit[0]; // maxTemp
startupData[1] = " " + max1DayAgo.arrayOfValue[1] + " " + max1DayAgo.arrayOfUnit[1]; // maxWindSped
startupData[2] = " " + max1DayAgo.arrayOfValue[2] + " " + max1DayAgo.arrayOfUnit[2]; // maxAirPressure
startupData[3] = " " + max1DayAgo.arrayOfValue[3] + " " + max1DayAgo.arrayOfUnit[3];// maxRainfall
startupData[4] = " " + min1DayAgo.arrayOfValue[0] + " " + min1DayAgo.arrayOfUnit[0]; // minTemp
startupData[5] = " " + min1DayAgo.arrayOfValue[1] + " " + min1DayAgo.arrayOfUnit[1];// minWindSped
startupData[6] = " " + min1DayAgo.arrayOfValue[2] + " " + min1DayAgo.arrayOfUnit[2];// minAirPressure
startupData[7] = " " + min1DayAgo.arrayOfValue[3] + " " + min1DayAgo.arrayOfUnit[3];// minRainfall
// Main fields
var getLatestTempObj = await webServiceObj.GetLatestDataAsync("umtTemp1");
var getLatestWindObj = await webServiceObj.GetLatestDataAsync("umtWindSpeed");
var getLatestwindDirObj = await webServiceObj.GetLatestDataAsync("umtAdjWinDir");
var getLatestairPressureObj = await webServiceObj.GetLatestDataAsync("umtAdjBaromPress");
startupData[8] = " " + getLatestTempObj.Value + " " + getLatestTempObj.Unit;//temperatureMainTxtBlock.Text
startupData[9] = " " + getLatestWindObj.Value + " " + getLatestWindObj.Unit;//temperatureMainTxtBlock.Text
startupData[10] = "" + getLatestwindDirObj.Value; //temperatureMainTxtBlock.Text
startupData[11] = " " + getLatestairPressureObj.Value + " " + getLatestairPressureObj.Unit;//temperatureMainTxtBlock.Text
startupData[12] = "Last update: " + getLatestwindDirObj.Timestamp;//temperatureMainTxtBlock.Text
**//pass the webservice data to the global variable
(App.Current as App).NavigateData = startupData;**
//since im using extendes splash screen i reset the navigation history so the user cannot go back to the extended splash screen
this.Frame.SetNavigationState(e.Parameter as string);
//Go to mainpage
this.Frame.Navigate(typeof(MainPage));
}
}
MainPage: Mainpageでは、拡張スプラッシュ スクリーンによってロードされたグローバル データをテキスト ボックスに表示します。
public sealed partial class MainPage : weather.Common.LayoutAwarePage
{
//Defining objects use through this page
maxMinSelector maxMinButtonSelector = new maxMinSelector();
parameterItem max1DayAgo = new parameterItem();
parameterItem min1DayAgo = new parameterItem();
parameterItem max1WeekAgo = new parameterItem();
parameterItem min1WeekAgo = new parameterItem();
parameterItem max1MonthAgo = new parameterItem();
parameterItem min1MonthAgo = new parameterItem();
EasingDoubleKeyFrame keyFrame = new EasingDoubleKeyFrame();
public MainPage()
{
this.InitializeComponent();
Loaded += MainPage_Loaded;
Code
------------------
------------------
------------------
------------------
//Cache the page
this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Code
------------------
------------------
------------------
------------------
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// HERE i use the global data initialised in the extended splash screen
base.OnNavigatedTo(e);
maxTempTextblock.Text = (App.Current as App).NavigateData[0];
maxWindSpedTextBlock.Text = (App.Current as App).NavigateData[1];
maxAirPressureTextBlock.Text = (App.Current as App).NavigateData[2];
maxRainfallTextBlock.Text = (App.Current as App).NavigateData[3];
minTempTextblock.Text = (App.Current as App).NavigateData[4];
minWindSpedTextBlock.Text = (App.Current as App).NavigateData[5];
minAirPressureTextBlock.Text = (App.Current as App).NavigateData[6];
minRainfallTextBlock.Text = (App.Current as App).NavigateData[7];
temperatureMainTxtBlock.Text = (App.Current as App).NavigateData[8];
WindSpeedTxtBlockLower.Text = (App.Current as App).NavigateData[9];
WindDirectionTxtBlockLower.Text = (App.Current as App).NavigateData[10];
airPressureTxtBlockLower.Text = (App.Current as App).NavigateData[11];
LastUpdateTextField.Text = (App.Current as App).NavigateData[12];
}
Code
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
}