BackgroundTask and LockScreen
LockScreen鎖屏,我們在使用電腦時經常會鎖屏,當我們鎖屏時,我們也可以看到一些訊息,如未讀郵件數、某聊天軟體的新訊息數等,這就是BackgroundTask與LockScreen之 間的共同實現了~
一般LockScreen的資訊包括以下幾部分:
(1) 日期與時間(2) 網路狀態(3)電池量 這是最基本的幾部分,當然還有系統自動化佈建的鎖定畫面 app,如郵箱、日曆、資訊等,那我們自己建立的應用如何?呢?
在這之前,先瞭解LockScreen的基本內容~ 1、什麼情況下需要將應用程式設定為鎖定畫面 app? 鎖定畫面 app一般用於向使用者報告重要或有意義的訊息,且訊息內容簡潔即時,使使用者一瞥螢幕,就能看到最新的資訊 2、聲明LockScreen應用能力 在應用程式的Package.appxmanifest中需要聲明鎖屏功能和螢幕顯示的徽章,具體如下 :
3、在程式中可以提示用於是否將應用放置於鎖屏上,通過BackgroundExecutionManager.RequestAccessAsync()會出現一個對話方塊,當選擇“allow”,程式將會放置於鎖屏中,但鎖定畫面 app最多隻能有7個,當超過七個,會詢問使用者替換哪個應用。
我們也可以手動將瓦片程式設定為鎖定畫面 app:
下面我們實現一個簡單的定時推送資訊至LockScreen APP:
第一步:建立一個空白頁面PushNotification.xaml,上面放置三個按鈕,分別實現設定APP到LockScreen、開啟後台定時推送訊息、登出背景工作三個按鈕
第二步:建立一個背景工作類NotificationBackTask.cs檔案,功能就是一人簡單的定時器,實現定時推送,代碼與前一篇的很相似,通過 BackgroundTaskProgressEventHandler去觸發,目前我還沒找到其它的方式去觸發主程式,還望高手指教一下~
第三步:設定主工程中的Package.appxmanifest檔案
同樣需要在聲明中添加背景工作 :
第四步:實現PushNotification.xaml的後台代碼
點擊”Set LockScreen App”按鈕:
async private void btnSetLockScreen_Click(object sender, RoutedEventArgs e)
{
BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();
switch (status)
{
case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity:
tbInfo.Text = "This app is on the lock screen and has access to Always-On Real Time Connectivity.";
btnSendBadge.IsEnabled = true;
break;
case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
tbInfo.Text = "This app is on the lock screen and has access to Active Real Time Connectivity.";
btnSendBadge.IsEnabled = true;
break;
case BackgroundAccessStatus.Denied:
tbInfo.Text = "This app is not on the lock screen.";
break;
case BackgroundAccessStatus.Unspecified:
tbInfo.Text = "The user has not yet taken any action. This is the default setting and the app is not on the lock screen.";
break;
default:
break;
}}
若APP沒有加入LockScreen,會出現以下畫面:
點擊“Send Badge BackTask”按鈕,同樣需要先註冊task
var builder = new BackgroundTaskBuilder();
builder.Name = SampleBackgroundTaskName;
builder.TaskEntryPoint = SampleBackgroundTaskEntryPoint;
SystemTrigger trigger = new SystemTrigger(SystemTriggerType.UserAway, false);
builder.SetTrigger(trigger);
SystemCondition condition = new SystemCondition(SystemConditionType.UserPresent);
if (condition != null)
{
builder.AddCondition(condition);
}
task = builder.Register();
task.Completed += task_Completed;
task.Progress += task_Progress;
在task_Progress事件中實現訊息的推送:
void task_Progress(BackgroundTaskRegistration sender, BackgroundTaskProgressEventArgs args)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
var taskRegistration = sender as IBackgroundTaskRegistration;
var progressArgs = args as BackgroundTaskProgressEventArgs;
if ((taskRegistration != null) && (progressArgs != null))
{//BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent(progressArgs.Progress);
//BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badgeContent.CreateNotification());
ITileWideSmallImageAndText03 tileContent = TileContentFactory.CreateTileWideSmallImageAndText03();
tileContent.TextBodyWrap.Text = "This tile notification has an image, but it won't be displayed on the lock screen";
tileContent.Image.Src = "ms-appx:///Assets/tile-sdk.png";
tileContent.RequireSquareContent = false;
}
});
}
以上實現了兩種推送,一種是簡單badge,還有一種是Tile資訊帶文本資訊的,對於後一種帶詳細資料,需要在PC Settings裏手動設定,文本資訊才會在LOCKSCREEN中顯示,如下:
以上就是LockScreen的簡單介紹,可能還有些不足之處,還望高手指點~