华为Android 8.0设备前台定位服务退后台被杀死如何解决?
问题根因
你遇到的服务被杀问题本质是华为基于安卓8.0定制的EMUI系统自带的激进后台进程管理策略导致,原生安卓规范下的前台服务实现也会被华为的电池优化、后台活动限制逻辑主动回收,除此之外你的现有代码也存在几处容易被系统回收的问题,修改方案如下:
现有代码问题及修复
1. 通知渠道优先级配置过低
你当前使用NotificationManager.IMPORTANCE_DEFAULT创建通知渠道,该优先级的通知不会弹出横幅,对应前台服务的系统优先级较低,更容易被回收,建议修改为IMPORTANCE_HIGH:
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "My Channel", NotificationManager.IMPORTANCE_HIGH);
同时通知构建时补充小图标配置,避免通知显示异常导致前台服务判定失效:
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setOngoing(true) .setSmallIcon(R.mipmap.ic_launcher) // 补充应用小图标,为前台服务通知必填项 .setContentTitle("Aplikace " + MainActivity.getContext().getString(R.string.app_name) + " odesílá polohu na pozadí.") .setContentIntent(pendingIntent) .build();
2. 服务启动模式选择错误
你当前返回START_NOT_STICKY,服务被系统异常杀死后不会自动重启,建议修改为START_STICKY,保证服务被异常杀掉后系统会尝试重新拉起:
@Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand: called."); getLocation(); return START_STICKY; // 替换原有START_NOT_STICKY }
3. PendingIntent Flag配置不规范
你当前传入的flag为0,安卓版本适配性差,建议修改为PendingIntent.FLAG_UPDATE_CURRENT,避免后续系统版本的适配问题:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
4. 未适配低版本前台服务启动逻辑
你当前只在安卓8.0及以上调用了startForeground,安卓8.0以下版本启动服务后也需要调用该方法,建议将startForeground逻辑移到版本判断外,低版本也执行前台服务绑定。
华为设备专属适配操作
需要引导用户手动修改系统设置,免除你应用的后台限制:
- 进入「设置-电池-电池优化」,找到你的应用,设置为「不允许」优化
- 进入「设置-应用和通知-应用启动管理」,找到你的应用,关闭「自动管理」,手动开启「允许自启动」「允许关联启动」「允许后台活动」三个开关
- 不要通过华为自带的一键清理功能清理你的应用,清理后会直接杀死前台服务
内容的提问来源于stack exchange,提问作者Martin Stejskal
相关产品推荐
相关产品推荐

