Xamarin.Forms下Android 11前台服务熄屏状态启动Activity问题求助
解决方案
1. 修正启动Activity使用的Context
你当前使用全局Application.Context启动Activity,Android 10及以上版本中,应用上下文属于后台上下文,即便是前台服务运行中,也会触发后台启动Activity限制。将启动Context替换为前台服务AntiTheft的实例Context即可。
2. 补全特殊权限申请与校验
你仅在清单中声明了权限,缺少动态校验与引导用户授权的逻辑:
2.1 清单补充权限
在AndroidManifest.xml中新增忽略电池优化权限:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
2.2 动态校验权限
应用启动时首先判断必要权限是否授予,未授权则引导用户开启:
// 检查悬浮窗权限(SYSTEM_ALERT_WINDOW) if (!Android.OS.Settings.CanDrawOverlays(Android.App.Application.Context)) { var intent = new Intent(Android.OS.Settings.ActionManageOverlayPermission, Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}")); intent.AddFlags(ActivityFlags.NewTask); Android.App.Application.Context.StartActivity(intent); } // 检查忽略电池优化权限 var powerManager = (PowerManager)Android.App.Application.Context.GetSystemService(Context.PowerService); if (!powerManager.IsIgnoringBatteryOptimizations(Android.App.Application.Context.PackageName)) { var intent = new Intent(Android.OS.Settings.ActionRequestIgnoreBatteryOptimizations, Android.Net.Uri.Parse($"package:{Android.App.Application.Context.PackageName}")); intent.AddFlags(ActivityFlags.NewTask); Android.App.Application.Context.StartActivity(intent); }
3. 修正Activity启动Intent参数
启动AlertActivity时新增ActivityFlags.FromBackground标记,提高后台启动优先级:
Intent mainIntent = new Intent(serviceContext, typeof(AlertActivity)); mainIntent.AddFlags( ActivityFlags.NewTask | ActivityFlags.ClearTop | ActivityFlags.SingleTop | ActivityFlags.FromBackground // 新增此行 ); mainIntent.PutExtra("address", address); // 修正:你之前的Extra key用了address变量,建议改为固定字符串 mainIntent.PutExtra("message", message); serviceContext.StartActivity(mainIntent);
4. 提前获取唤醒锁
不要等Activity onCreate再获取唤醒锁,启动Activity前就提前获取,确保系统能正常调度页面启动:
// 启动Activity前先获取唤醒锁,持有5秒足够Activity完成初始化 var powerManager = (PowerManager)serviceContext.GetSystemService(Context.PowerService); var wakeLock = powerManager.NewWakeLock( WakeLockFlags.Full | WakeLockFlags.AcquireCausesWakeup | WakeLockFlags.OnAfterRelease, "MyApp:AlertWakeLock" ); wakeLock.Acquire(5000); // 自动5秒后释放,避免耗电
5. 修正AlertActivity的生命周期逻辑
补充唤醒锁的释放,避免内存泄漏:
protected override void OnDestroy() { base.OnDestroy(); // 页面销毁时清理Window标记 Window.ClearFlags( WindowManagerFlags.ShowWhenLocked | WindowManagerFlags.KeepScreenOn | WindowManagerFlags.DismissKeyguard | WindowManagerFlags.TurnScreenOn ); }
内容的提问来源于stack exchange,提问作者Soroush Trb
相关产品推荐
相关产品推荐

