信息
您所需的主题如下所示。但此主题未包含在此库中。

如何禁用 Windows Phone 8 低内存手机的应用中的功能

2014/6/18

适用于:Windows Phone OS 7.1

如果您创建了要在 低内存设备 上运行的应用,而该应用使用的功能会消耗过多内存或您使用了泛型后台代理,则可以检测运行该应用的设备的内存工作集,然后禁用后台代理或其他非常占用内存的功能。本主题将演示如何执行此操作的一个示例。

检测内存限制和更改应用行为的步骤

  1. 声明属性以包含可以表示设备是否是 低内存设备 的值。通常将该值存储在应用设置中。

    private static bool isLowMemDeviceValue;
    public static bool IsLowMemDevice
    {
        get
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains("IsLowMemDevice"))
                isLowMemDeviceValue = (bool)IsolatedStorageSettings.ApplicationSettings["IsLowMemDevice"];
            return isLowMemDeviceValue;
        }
        set {
            if (value != IsLowMemDevice)
                IsolatedStorageSettings.ApplicationSettings["IsLowMemDevice"] = value;
        }
    }
    
  2. 检查设备的应用内存限制。这可以通过调用 GetValue(String) 和传递 ApplicationWorkingSetLimit 来完成。该方法返回 long 值,表示设备的应用内存限制。

  3. 查看从 GetValue(String) 方法返回的值是否小于 90 MB (94371840)。如果是,则设备是 低内存设备。

  4. 在 try/catch 块中,包装对 GetValue(String) 的调用。用户可能没有将其设备升级至 Windows Phone 操作系统的最新版本,这意味着其设备不支持该调用,而且可能会出现 ArgumentOutOfRangeException

    说明注意:

    GetValue(String) 的一些调用需要设备标识功能 (ID_CAP_IDENTITY_DEVICE),如果您在应用程序中使用 DeviceExtendedProperties 类,接收时会添加该功能。但是,如果您使用 GetValue(String) 方法获取 ApplicationWorkingSetLimit,则可以取消设备标识功能,具体做法是在应用接收之前把它从应用清单中移除,这样在接收过程中,就不会重新添加该功能。

  5. 根据 GetValue(String) 方法的结果,设置在第一步中声明的属性。以下代码演示应用启动时执行第 2-5 步的示例。

    private void Application_Launching(object sender, LaunchingEventArgs e)
    {
        try
        {
            // Check the working set limit and set the IsLowMemDevice flag accordingly.
            Int64 result = (Int64)DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit");
            if (result < 94371840L)
                MainPage.IsLowMemDevice = true;
            else
                MainPage.IsLowMemDevice = false;
        }
        catch (ArgumentOutOfRangeException)
        {
            // Windows Phone OS update not installed, which indicates a 512-MB device.
             MainPage.IsLowMemDevice = false;
        }
    }
    
  6. 使用所存储的值改变代码路径,排除会超出内存限制的功能或 低内存设备 不支持的功能。以下代码演示 OnNavigatedPage 方法。此代码会通过检查确定设备是否为 低内存设备,如果是,则显示不同的 UI。这可以防止后台代理运行。

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (IsLowMemDevice)
            ShowMemPanel();
        else
        {
            periodicTask = ScheduledActionService.Find(periodicTaskName) as PeriodicTask;
            if (periodicTask != null)
            {
                PeriodicStackPanel.DataContext = periodicTask;
            }
            resourceIntensiveTask = ScheduledActionService.Find(resourceIntensiveTaskName) as ResourceIntensiveTask;
            if (resourceIntensiveTask != null)
            {
                ResourceIntensiveStackPanel.DataContext = resourceIntensiveTask;
            }
            ignoreCheckBoxEvents = false;
        }
    }
    
    private void ShowMemPanel()
    {
        // Hide the agent panels and show a simple panel with a textblock instead.
        // The user will not be able to start the background agents.
        MemTextBlock.Text = "Mem usage: " + DeviceStatus.ApplicationPeakMemoryUsage +
            "/" + DeviceStatus.ApplicationMemoryUsageLimit;
        MemStackPanel.Visibility = Visibility.Visible;
        PeriodicStackPanel.Visibility = Visibility.Collapsed;
        ResourceIntensiveStackPanel.Visibility = Visibility.Collapsed;
        ignoreCheckBoxEvents = true;
    }
    

显示: