SDK33升级至SDK34后Foreground Service启动异常修复方案咨询
问题场景
将应用从SDK33升级至SDK34后,进入问卷图片上传页面时抛出异常:
Android.App.ServiceStartNotAllowedExceptionInvoker: 'Starting FGS without a type callerApp=ProcessRecord{3e07c0e 4863:com.OIA.oia_agent.dev/u0a190} targetSDK=34'
这是Android 14(API 34)对前台服务(FGS)的启动规则做了严格限制导致的——必须指定前台服务类型,并声明对应权限。
修改方案
1. UploadProgressService.cs 修改
关键调整:
- 为Service指定对应场景的前台服务类型(文件上传属于数据同步场景,用
TypeDataSync) - 补全类继承关系与必填抽象方法
修改后的完整代码:
using Android.App; using Android.Content; using Android.OS; using OIA_Agent.Helpers; using OIA_Agent.Services.ServiceInterfaces; using Xamarin.Forms; namespace OIA_Agent.Droid.Notification { // 指定前台服务类型为数据同步,匹配文件上传场景 [Service(ForegroundServiceType = ForegroundService.TypeDataSync)] public class UploadProgressService : Service // 补全继承Service基类 { private const int ServiceRunningNotifID = 1001; // 补充原代码缺失的通知ID常量 private string JobNumber; private string foregroundChannelId; public override void OnCreate() { base.OnCreate(); } public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { JobNumber = intent.GetStringExtra("JobNumber"); foregroundChannelId = intent.GetStringExtra("notificationChannelId"); base.OnStartCommand(intent, flags, startId); var notification = DependencyService.Get<IProgressNotificationService>() .ReturnNotif(foregroundChannelId, $"{ConstantHelper.Alerts.UploadStarted} {JobNumber}", $"{ConstantHelper.Alerts.UploadInProgress1}{JobNumber}{ConstantHelper.Alerts.UploadInProgress2}"); StartForeground(ServiceRunningNotifID, notification); return StartCommandResult.Sticky; } public override void OnDestroy() { base.OnDestroy(); } public override bool StopService(Intent name) { return base.StopService(name); } // Service基类要求必须实现的抽象方法 public override IBinder OnBind(Intent intent) { return null; } } }
2. AndroidManifest.xml 修改
关键调整:
- 替换通用前台服务权限为具体的
FOREGROUND_SERVICE_DATA_SYNC权限 - 在application节点内显式声明UploadProgressService,并指定前台服务类型
修改后的核心代码片段:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="46" android:versionName="2.5.2" package="com.OIA.oia_agent.dev" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="34" /> <!-- 替换原通用FOREGROUND_SERVICE权限为具体类型权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <!-- 保留其他原有权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-- ... 其余权限省略 ... --> <application ...> <!-- 保留原有activity、receiver等节点 --> <!-- 新增UploadProgressService的声明,与代码中指定的类型匹配 --> <service android:name=".Notification.UploadProgressService" android:foregroundServiceType="dataSync" /> <!-- 保留原有provider、meta-data等节点 --> </application> </manifest>
额外说明:
- Android 14不再支持通用的
FOREGROUND_SERVICE权限,必须使用对应场景的具体权限 - 移除无用的
INSTANT_APP_FOREGROUND_SERVICE权限(非即时应用无需声明)
注意事项
启动前台服务的时机必须是应用处于前台可见状态(比如用户点击上传按钮后立即启动),Android 14禁止后台无豁免场景下启动前台服务。
内容的提问来源于stack exchange,提问作者Yajush Pratap Singh
相关产品推荐
相关产品推荐

