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项目中:
- 在
AndroidManifest.xml
文件中,添加此权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
将 Xamarin.Essentials 依赖项添加到 platform-agnostic 和 android 项目。并且不要忘记在 android 项目中 initialize Xamarin.Essentials。
创建 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);
}
});
}
}
}
- 在 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
有时需要在应用程序中关闭睡眠模式,而冗长的过程是运行。该过程完成后,可以再次打开睡眠模式。
如何在 Xamarin 中为 Android 和 iOS 项目做到这一点?
我们将创建一个接口并使用 DependencyService 在 platform-agnostic 项目中 运行 platform-specific 实现。
在与平台无关的项目中创建一个接口:
namespace MyCompany.Services {
public interface ISleepModeHandler
{
public void BlockSleepMode(bool blockSleepMode);
}
}
在Android项目中:
- 在
AndroidManifest.xml
文件中,添加此权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
将 Xamarin.Essentials 依赖项添加到 platform-agnostic 和 android 项目。并且不要忘记在 android 项目中 initialize Xamarin.Essentials。
创建 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);
}
});
}
}
}
- 在 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