UWP: 實現 UWP 應用自啓動

原文:UWP: 實現 UWP 應用自啓動html

上一篇文章中,咱們實現了使用命令行來啓動 UWP 應用,在這一篇文章中,咱們會實現 UWP 應用自啓用的實現,也即開機後或用戶登錄後,應用本身啓動。這些特性原來都是 Win32 程序所具有的,UWP 可以支持這些特性使得它和 Win32 程序的行爲進一步相同。 編程

實現

與實現命令行啓動同樣,實現自啓動也大致上分爲兩步:首先,在 Package.appxmanifest 中添加 windows.startupTask 擴展(Extension);而後,在 App 類中處理 OnActivated 事件。事實上,除了這兩步外,咱們還須要增長檢查 StartupTask 的狀態並容許用戶控制自啓動的邏輯。windows

1. 修改 Package.appxmanifest 

右擊項目中的 Package.appxmanifest 文件,在快捷菜單中選擇「打開方式「->」XML 文本編輯器「。打開後,對它的內容按如下修改:app

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
  IgnorableNamespaces="uap mp uap5">
  ...
  <Applications>
    <Application 
      ...
      <Extensions>
        <uap5:Extension Category="windows.startupTask" EntryPoint="AppAutoRun.App" Executable="AppAutoRun.exe">
          <uap5:StartupTask DisplayName="AppAutoRun" Enabled="true" TaskId="AppAutoRun"/>
        </uap5:Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

上述加粗的部分就是添加的擴展 windows.startupTask,其 EntryPoint 和 Executable 屬性分別指明 App 類的完整名稱以及當前應用的 exe 名稱。async

在 Extension 節點中,添加了一個節點 StartupTask,它有三個屬性,說明以下:編輯器

  • TaskId:任務Id,必填,在全部的 UWP 應用中,它必須是惟一的,不能和其它應用的 TaskId 相同;
  • Enabled:是否啓用,必填,指明是否啓用當前應用爲自啓動行爲;
  • DisplayName:顯示名稱,可選,在「任務管理器」中「啓動」選項卡中的顯示名稱;

須要說明的是,Enabled 屬性應該設置爲 false;事實上這個屬性會被忽略;由於 UWP 要實現自啓動,至少須要啓動一次,而且向用戶請求贊成才行。另外目前只能添加一個 StartupTask 節點。ide

此時,能夠將應用部署(Deploy)到本機上,而後,在「任務管理器」中「啓動」選項卡上,咱們就能夠看到了。ui

這裏,右擊每一個任務,能夠對它的狀態進行控制(啓用/禁用),能夠看到當前應用的狀態是「已禁用」。注意,在設置它的狀態以前,App 須要至少被啓動過一次。不然這裏的設置是不起做用的。this

 2. 查看並更改任務狀態

除了在 Package.appxmanifest 中增長擴展外,咱們還須要使用相關的 API 來查看所添加的 StartupTask 的狀態,以及對它的更改。在 MainPage.xaml 中增長如下代碼:spa

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid Margin="12">
            <StackPanel>
                <TextBlock x:Name="tbState" />
                <Button
                    x:Name="btnSetState"
                    Margin="0,4,0,0"
                    Click="btnSetState_Click" />
            </StackPanel>
        </Grid>
    </Grid>

在 MainPage.xaml.cs 中增長如下代碼:

        private async void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            await LoadState();
        }

        public async Task LoadState()
        {
            var task = await StartupTask.GetAsync("AppAutoRun");
            this.tbState.Text = $"Status: {task.State}";
            switch (task.State)
            {
                case StartupTaskState.Disabled:
                    // 禁用狀態
                    this.btnSetState.Content = "啓用";
                    this.btnSetState.IsEnabled = true;
                    break;
                case StartupTaskState.DisabledByPolicy:
                    // 由管理員或組策略禁用
                    this.btnSetState.Content = "被系統策略禁用";
                    this.btnSetState.IsEnabled = false;
                    break;
                case StartupTaskState.DisabledByUser:
                    // 由用戶手工禁用
                    this.btnSetState.Content = "被用戶禁用";
                    this.btnSetState.IsEnabled = false;
                    break;
                case StartupTaskState.Enabled:
                    // 當前狀態爲已啓用
                    this.btnSetState.Content = "已啓用";
                    this.btnSetState.IsEnabled = false;
                    break;
            }
        }

        private async void btnSetState_Click(object sender, RoutedEventArgs e)
        {
            var task = await StartupTask.GetAsync("AppAutoRun");
            if (task.State == StartupTaskState.Disabled)
            {
                await task.RequestEnableAsync();
            }

            // 從新加載狀態
            await LoadState();
        }

咱們經過 StartupTask 類(位於 Windows.ApplicationModel 命名空間下)的 GetAsync 來獲取指定 TaskId 的自啓動任務(StartupTask)。StartupTask 類具備一個 State 的枚舉屬性,用於表示其狀態。它們的值及其意義,在註釋中已經說明。

補充說明如下幾點:

  1. 最開始時,任務的 State 是 Disabled;
  2. 惟有當其 State 是 Disabled 時,才能以編程的方式使用啓動;
  3. 當其 State 是 DisabledByUser 或 DisabledByPolicy,須要經由用戶手工啓動;
  4. 不支持以編程的方式使其 State 成爲 Disabled;

經過 StartupTask 類的 RequestEnableAsync 方法,能夠向用戶請求將其啓動,調用這個方法後,會彈出以下窗口:

當用戶選擇「啓用」後,下次系統啓動後它就會自動啓動,反之,若是選擇」禁用「,那麼它的狀態會是 DisabledByUser。要想啓用它,就須要打開」任務管理器「,在」啓動「選項卡上右擊它,選擇「啓用」。

3. 處理 OnActivated 事件

而後,在 App 類的 OnActivated 事件上增長對 ActivationKind 類的判斷,並做相應的處理便可。代碼以下:

protected override void OnActivated(IActivatedEventArgs args)
{
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        rootFrame = new Frame();
        Window.Current.Content = rootFrame;
    }

    var protoclForResultsArgs = (ProtocolActivatedEventArgs)args;
    rootFrame.Navigate(typeof(MainPage), protoclForResultsArgs);
    Window.Current.Activate();          
}

 

        protected override void OnActivated(IActivatedEventArgs args)
        {
            Frame rootFrame = Window.Current.Content as Frame;
            if (rootFrame == null)
            {
                rootFrame = new Frame();
                Window.Current.Content = rootFrame;
            }
            
            if (args.Kind == ActivationKind.StartupTask)
            {
                var startupArgs = args as StartupTaskActivatedEventArgs;
            }

            rootFrame.Navigate(typeof(MainPage), args.Kind);
            Window.Current.Activate();
        }

最後,要注意的是:若是啓用了自啓動,當系統啓動後,應用會以最小化的方式啓動。 

參考資料:

Configure your app to start at log-in

相關文章
相關標籤/搜索