【问题标题】:Get lifecycle of UWP app获取 UWP 应用的生命周期
【发布时间】:2017-10-02 13:28:12
【问题描述】:

我正在创建一个进程内 UWP 应用服务,以及另一个通过应用服务与应用通信的(桌面)客户端程序。客户端程序想知道 UWP 应用程序当前是否正在运行(在前台)、是否已经在后台运行桌面应用程序打开 AppServiceConnection、被挂起或没有运行一点也不。换句话说,应用程序需要能够通过应用程序服务传达它在其lifecycle 中的位置。

除了实现我自己的状态变量之外,还有什么方法可以以编程方式检测应用程序的生命周期状态,每当引发相关事件之一时我都会更新该状态变量?似乎应该是可能的,但我找不到它的 API。显然,它永远不会告诉您您当前已暂停或未运行,但能够区分“除此应用服务任务外暂停”和“在前台主动运行”之间的区别会很有用。

【问题讨论】:

    标签: uwp windows-10-universal lifecycle background-task


    【解决方案1】:

    客户端程序想知道 UWP 应用当前是否正在运行(在前台),在桌面应用打开 AppServiceConnection 之前已经在后台运行

    在桌面应用打开AppServiceConnection 连接之前,客户端应该无法与应用服务提供者通信,因为 UWP 应用是沙盒。获取内部应用服务提供者的当前状态,对客户端应用没有用处。如果客户端桌面应用程序是.NET Framework,您可以尝试使用Process.Responding 属性来获取服务提供者进程状态。例如Process.Responding为真则服务提供者“在前台主动运行”,如果为假则暂停提供者,如果找不到提供者进程则终止提供者。

    static void Main(string[] args)
    { 
        Process[] processes = Process.GetProcesses();
    
        foreach (Process process in processes)
        {
           if (process.ProcessName == "AppServicesProvider")
                Console.WriteLine("Process Name: {0}, Responding: {1}", process.ProcessName, process.Responding);
        } 
        Console.ReadLine();
    }
    

    换句话说,应用需要能够通过应用服务传达它在其生命周期中所处的位置。

    如果您的意思是通过应用服务,那么您提到的在应用的执行状态发生变化时将状态存储在app data 中的方式应该可以正常工作。看起来您不想使用它,但实际上触发的状态匹配事件句柄表明应用程序的执行状态已更改。

    private async void App_Suspending(object sender, SuspendingEventArgs e)
    {
        SuspendingDeferral deferral = e.SuspendingOperation.GetDeferral();
        Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings;
        localSettings.Values["currentlife"] = "Suspended";
        deferral.Complete();
    }
    private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
    {
        var messageDeferral = args.GetDeferral();
        Windows.Storage.ApplicationDataContainer localSettings =Windows.Storage.ApplicationData.Current.LocalSettings;
        Object value = localSettings.Values["currentlife"];
        try
        {
            var input = args.Request.Message; 
            //Create the response
            var result = new ValueSet(); 
            result.Add("result", value);
            //Send the response
            await args.Request.SendResponseAsync(result);
        }
        finally
        {
            //Complete the message deferral so the platform knows we're done responding
            messageDeferral.Complete();
        }
    }
    

    【讨论】:

    • 有问题的桌面应用程序是一个后台进程,它通过桌面桥包含在 UWP 应用程序包中。这是一个长期运行的过程,既可以在应用程序启动之前启动(通过在 Windows 登录时启动),也可以在应用程序关闭后持续存在。桌面应用程序可能向 UWP 应用程序发送的某些消息仅在 UWP 应用程序已在运行时才有意义,在它已暂停或尚未启动时才有意义。
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 2012-12-29
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多