У меня серьезная проблема с режимом энергосбережения на Android.Мое приложение падает, когда включен режим энергосбережения.Проблема проявляется на телефонах Samsung Galaxy (или на любом телефоне / эмуляторе с AOSP или LineageOS), но никогда не возникала на Meizu или Xiaomi (думаю, из-за их собственных оптимизаций батареи; приведенный ниже код всегда возвращает false, но ненезависимо от того, был ли включен режим энергосбережения на этих телефонах).
1-й тест: режим энергосбережения отключен, приложение работает отлично.
2-й тест: режим энергосбережения включен, приложение не занесено в белый список, приложениевылетает при запуске.
3-й тест: режим энергосбережения отключен, приложение запущено и свернуто;когда я включаю режим энергосбережения, приложение просит меня добавить себя в белый список;даже если я добавлю приложение в белый список, оно все равно может аварийно завершиться.
4-й тест: режим энергосбережения включен, приложение занесено в белый список;приложение работает частично, зависает или зависает случайным образом.
Я знаю о режиме Doze и включенном разрешении REQUEST_IGNORE_BATTERY_OPTIMIZATIONS в AndroidManifest.xml.Вот мой код, который проверяет, включен ли режим энергосбережения и находится ли приложение в белом списке.Но мое приложение падает до того, как этот код был достигнут (за исключением одной проблемы, которую я описал).
PowerWorker.cs
[assembly: Dependency(typeof(BSWApp.Droid.PowerWorker))]
namespace MyApp.Droid
{
class PowerWorker : IPowerWorker
{
public bool IsInPowerSavingMode()
{
PowerManager powerManager = (PowerManager)Application.Context.GetSystemService(Context.PowerService);
bool isPowerSaveMode = powerManager.IsPowerSaveMode;
return isPowerSaveMode;
}
public bool IsInWhiteList(string packageName)
{
PowerManager powerManager = (PowerManager)Application.Context.GetSystemService(Context.PowerService);
bool isInWhiteList = powerManager.IsIgnoringBatteryOptimizations(packageName);
return isInWhiteList;
}
public void RequestWhiteList(string packageName)
{
Application.Context.StartActivity(new Intent(Provider.Settings.ActionRequestIgnoreBatteryOptimizations, Net.Uri.Parse("package:"+packageName)));
}
}
}
Logcat с момента сбоя:
01-31 02:31:58.015 1511 1511 E AndroidRuntime: FATAL EXCEPTION: main
01-31 02:31:58.015 1511 1511 E AndroidRuntime: Process: [hidden], PID: 1511
01-31 02:31:58.015 1511 1511 E AndroidRuntime: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at MyApp.Handlers.MessageHandler+<DisplayConfirmation>d__3.MoveNext () [0x00014] in <bf9ac05a02a44989a618d26fad48d12d>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: --- End of stack trace from previous location where exception was thrown ---
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at MyApp.ViewModels.PowerWorkerViewModel+<LaunchPowerSettings>d__1.MoveNext () [0x0006e] in <bf9ac05a02a44989a618d26fad48d12d>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: --- End of stack trace from previous location where exception was thrown ---
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in <fe08c003e91342eb83df1ca48302ddbb>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at (wrapper dynamic-method) System.Object.17(intptr,intptr)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at mono.java.lang.RunnableImplementor.n_run(Native Method)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:751)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6077)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
01-31 02:31:58.015 1511 1511 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-31 02:31:58.016 534 546 W ActivityManager: Force finishing activity [hidden]/md5be088b8fe6dd8127a24806968ac5b197.MainActivity
Независимо от того, где я пытаюсь запустить его (я пытался из App.cs (общий код) и из MainActivity.cs (локальный код Android)), я все равно получаю один и тот же результат.Я ожидал, что приложение попросит пользователя добавить приложение в белый список, но на самом деле, даже если пользователь сделал это, это не имеет значения, потому что приложение все равно может аварийно завершить работу, даже если он включен в белый список.Так что я совершенно не понимаю, что делать.