You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:45:04