Xamarin:在 运行 个进程时阻止睡眠模式

Xamarin: Block sleep mode while running a process

有时需要在应用程序中关闭睡眠模式,而冗长的过程是运行。该过程完成后,可以再次打开睡眠模式。

如何在 Xamarin 中为 Android 和 iOS 项目做到这一点?

我们将创建一个接口并使用 DependencyService 在 platform-agnostic 项目中 运行 platform-specific 实现。

在与平台无关的项目中创建一个接口:

namespace MyCompany.Services {
    public interface ISleepModeHandler
    {
        public void BlockSleepMode(bool blockSleepMode);
    }
}

在Android项目中:

  1. AndroidManifest.xml 文件中,添加此权限:
    <uses-permission android:name="android.permission.WAKE_LOCK" />
  1. 将 Xamarin.Essentials 依赖项添加到 platform-agnostic 和 android 项目。并且不要忘记在 android 项目中 initialize Xamarin.Essentials

  2. 创建 class:

using Android.Views;
using MyCompany.Android.Services;
using MyCompany.Services
using Xamarin.Essentials;
using Xamarin.Forms;
    
[assembly: Dependency(typeof(SleepModeHandlerForDroid))]
namespace MyCompany.Android.Services
{
    public class SleepModeHandlerForDroid : ISleepModeHandler
    {
        public void BlockSleepMode(bool blockSleepMode)
        {
            Xamarin.Forms.Device.BeginInvokeOnMainThread(() => 
            { 
                MainActivity activity = (MainActivity)Platform.CurrentActivity;

                if (blockSleepMode)
                {
                    activity.Window.AddFlags(WindowManagerFlags.KeepScreenOn);
                }
                else
                {
                    activity.Window.ClearFlags(WindowManagerFlags.KeepScreenOn);
                }
            });
        }
    }
}
  1. 在 iOS 项目中创建 class:
using MyCompany.Services;
using MyCompany.iOS.Services;
using UIKit;
using Xamarin.Forms;

[assembly: Dependency(typeof(SleepModeHandlerForiOS))]
namespace MyCompany.iOS.Services
{
    [Foundation.Preserve(AllMembers = true)]
    public class SleepModeHandlerForiOS : ISleepModeHandler
    {
        public void BlockSleepMode(bool blockSleepMode)
        {
            Xamarin.Forms.Device.BeginInvokeOnMainThread(() => 
            {
                UIApplication.SharedApplication.IdleTimerDisabled = blockSleepMode;
            });
        }
    }
}

就是这样。现在,在平台不可知模块中,当你想在处理时阻止睡眠模式,并在之后打开它时使用以下方法:

ISleepModeHandler sleepModeHandler = DependencyService.Get<ISleepModeHandler>();
sleepModeHandler.BlockSleepMode(true); // blocking the sleep mode

// your process goes here

sleepModeHandler.BlockSleepMode(false); // allowing the sleep mode again