Android 8.0 + ,对后台服务进行了限制了。如果依然采用之前startService()方式。

会导致问题。

前后台服务的一些区别:

有人可能会问,后台服务我们可以自己创建 ONGOING 的 Notification 这样就成为前台服务吗?答案是否定的,前台服务是在做了上述工作之后需要调用 startForeground ( android 2.0 及其以后版本 )或 setForeground (android 2.0 以前的版本)使服务成为 前台服务。这样做的好处在于,当服务被外部强制终止掉的时候,ONGOING 的 Notification 任然会移除掉。

api 8.0+ 、9.0 关于服务的行为变更。

8.0

后台执行限制

Android 8.0 为提高电池续航时间而引入的变更之一是,当您的应用进入已缓存状态时,如果没有活动的组件,系统将解除应用具有的所有唤醒锁。

此外,为提高设备性能,系统会限制未在前台运行的应用的某些行为。具体而言:

现在,在后台运行的应用对后台服务的访问受到限制。

应用无法使用其清单注册大部分隐式广播(即,并非专门针对此应用的广播)。

默认情况下,这些限制仅适用于针对 O 的应用。不过,用户可以从 Settings 屏幕为任意应用启用这些限制,即使应用并不是以 O 为目标平台。

Android 8.0 还对特定函数做出了以下变更:

如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。

新的 Context.startForegroundService() 函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的 startForeground() 函数。

如需了解详细信息,请参阅后台执行限制。

9.0

前台服务

针对 Android 9 或更高版本并使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

如果针对 Android 9 或更高版本的应用尝试创建一个前台服务且未请求 FOREGROUND_SERVICE,则系统会引发 SecurityException。

网友推荐的解决方式:

原来startService()需要根据sdk版本进行兼容

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

context.startForegroundService(intent);

} else {

context.startService(intent);

}

系统说明在调用 context.startForegroundService(intent);服务后5s内需要调用

startForeground(1, notification);

根据网友提供方案,在 api =26 级别可以正常跑起来,但是在api =27 级别下,启动直接崩溃,具体crash 异常日志如下:

09-03 16:13:28.563 6124-6124/com.nuoyuan.nyd E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.nuoyuan.nyd, PID: 6124

android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel= pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1768)

at android.os.Handler.dispatchMessage(Handler.java:106)

at android.os.Looper.loop(Looper.java:164)

at android.app.ActivityThread.main(ActivityThread.java:6494)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

这里牵扯到android 8.0 关于 Notification 的行为变更 ###通知

在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括:

图 1. 用户可以长按应用启动器图标以查看 Android 8.0 中的通知。

通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息,请参阅通知标志指南。

通知标志:Android 8.0 引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。通知标志也称为通知点。要了解如何调整通知标志,请参阅通知标志指南。

休眠:用户可以将通知置于休眠状态,以便稍后重新显示它。重新显示时通知的重要程度与首次显示时相同。应用可以移除或更新已休眠的通知,但更新休眠的通知并不会使其重新显示。

通知超时:现在,使用 setTimeoutAfter() 创建通知时您可以设置超时。您可以使用此函数指定一个持续时间,超过该持续时间后,通知应取消。如果需要,您可以在指定的超时持续时间之前取消通知。

通知设置:当您使用 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCESIntent 从通知创建指向应用通知设置的链接时,您可以调用 setSettingsText() 来设置要显示的文本。此系统可以提供以下 Extra 数据和 Intent,用于过滤应用必须向用户显示的设置:EXTRA_CHANNEL_ID、NOTIFICATION_TAG 和 NOTIFICATION_ID。

通知清除:系统现在可区分通知是由用户清除,还是由应用移除。要查看清除通知的方式,您应实现 NotificationListenerService 类的新 onNotificationRemoved() 函数。

背景颜色:您现在可以设置和启用通知的背景颜色。只能在用户必须一眼就能看到的持续任务的通知中使用此功能。例如,您可以为与驾车路线或正在进行的通话有关的通知设置背景颜色。您还可以使用 Notification.Builder.setColor() 设置所需的背景颜色。这样做将允许您使用 Notification.Builder.setColorized() 启用通知的背景颜色设置。

消息样式:现在,使用 MessagingStyle 类的通知可在其折叠形式中显示更多内容。对于与消息有关的通知,您应使用 MessagingStyle 类。您还可以使用新的 addHistoricMessage() 函数,通过向与消息相关的通知添加历史消息为会话提供上下文。

根据上面提示,Notification 需要添加 channelId 才可以正常使用

如下修改,可以正常兼容 api 级别 8.0 ,8.1 + 的service 正常开启

public class UploadFilesIntentService extends IntentService {

private static final String UPLOAD_FILE = "com.nuoyuan.statistic.action.UPLOAD_FILE";

private static String loadUrlPath = "";

private static SttcHeadParams mHeadParams;

public static final String CHANNEL_ID_STRING = "nyd001";

@Override

public void onCreate() {

super.onCreate();

//适配8.0service

NotificationManager notificationManager = (NotificationManager) MyApp.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);

NotificationChannel mChannel = null;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

mChannel = new NotificationChannel(CHANNEL_ID_STRING, "诺秒贷", NotificationManager.IMPORTANCE_HIGH);

notificationManager.createNotificationChannel(mChannel);

Notification notification = new Notification.Builder(getApplicationContext(), CHANNEL_ID_STRING).build();

startForeground(1, notification);

}

}

public UploadFilesIntentService() {

super("UploadFilesIntentService");

}

public static void startActionFoo(Context context, String loadPath, SttcHeadParams headParams) {

Intent intent = new Intent(context, UploadFilesIntentService.class);

intent.setAction(UPLOAD_FILE);

mHeadParams = headParams;

loadUrlPath = loadPath;

//开启服务兼容

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

context.startForegroundService(intent);

} else {

context.startService(intent);

}

}

……

……

…….

}

引用

android8.1启动前台服务,Android 8.0 + Service开启方式兼容处理相关推荐

  1. android 8.0手机开服务端,Android 8.0 + Service开启方式兼容处理

    Android 8.0 + ,对后台服务进行了限制了.如果依然采用之前startService()方式. 会导致问题. 前后台服务的一些区别: 有人可能会问,后台服务我们可以自己创建 ONGOING ...

  2. android8.1启动前台服务,Android - 保活(1)前台服务保活

    老婆保佑,代码无BUG 前言 项目中遇到一个需求,需要竟可能的上传用户的定位信息,引发了我对目前已知的保活手段的探究,同时也遇到过客户说,推送不能收到,不能像微信那样,MMP的,不想理客户 目录 一: ...

  3. android q启动前台服务,Android 启动前台服务,适配 vivo 与 OPPO 手机,第一期

    Android 启动前台服务,华为.小米.三星.OPPO.VIVO的配合程度接 这是前文链接,我先甩在这里,上篇文章主要分析了几种品牌手机关于通知的配合程度,这篇文章先写第一期的解决方案,毕竟需求还是 ...

  4. 检查App是否有在后台启动前台服务的行为命令

    可在Terminal终端执行以下adb命令,该命令会监控你的App是否有在后台启动前台服务的行为,一旦有此行为,就会在通知栏推送一条提醒,定位到触发此行为的代码处: adb shell device_ ...

  5. android 4.0模拟器启动不了,Android 4.0 framework源码修改编译,模拟器运行不起来,求助...

    当前位置:编程学习 > wap >> Android 4.0 framework源码修改编译,模拟器运行不起来,求助 我下载编译了android 4.0 ICS的源码,然后能利用编译 ...

  6. 三星android8 日期,三星披露升级Android 8.0时间 明年年初

    TechWeb报道自从谷歌正式发布Android 8.0之后,众多第三方厂商对旗下手机升级最新系统进度,又成了对应用户关注的重点.比如三星,终于开始告之用户对自家手机适配Android 8.0的时间. ...

  7. Android 9.0 默认开启WLAN热点设置默认热点名称和密码

    1.概述 在android 9.0的系统产品开发中,在项目产品需求中,对于wifi和默认热点的使用也是常有的功能,在最近的项目开发中,需要开启WLAN热点,然后设置WLAN的默认热点 的名称和密码功能 ...

  8. 为 Android 8.0 强制开启全局圆形图标规范

    原文地址:https://sspai.com/post/41011 看到标题,很多人也许会问:引入了 自适应图标规范 后,在 Android 8.0 上我们已经可以通过一些第三方 Launcher(比 ...

  9. 解决Picasso在Android 5.0以下版本不兼容https导致图片不显示

    近期在项目中遇到了一个问题,使用picasso加载图片在Android5.0以下版本图片显示不来. 由于之前在几个项目中都使用过picasso而且未出现类似问题,觉得值得好好研究一下. 简单定位一下问 ...

最新文章

  1. java控制台输入空格输出后不显示_为撒我加上输入输出流的代码后控制台反而什么都不显示了呢?...
  2. 李宏毅深度学习——第一天
  3. Count Complete Tree Nodes
  4. Courses hdu 1083(匹配)
  5. 解题报告 Number
  6. WinSock I/O 模型 -- IOCP 模型
  7. iOS 利用UIDocumentInteractionController打开和预览文档
  8. python小城市创业好项目_小城市创业好项目有哪些?
  9. 数据清洗-拉格朗日插值
  10. Leetcode每日一题:861.score-after-flipping-matrix(反转矩阵后的得分)
  11. beetle 2.7海量消息广播测试
  12. Git基础:第九、十章 Git可视化工具 Git团队协作以及合并时的diff工具
  13. XAP部署错误代码大全
  14. 基于JSP网上购书系统
  15. nc工具测试tcp/udp协议
  16. 无法安装冰点还原_教程|有备有还,再备不难,如何实现整机还原?
  17. C语言计算机二级选择题重点,2014年计算机二级C语言重点选择题笔试复习资料.doc...
  18. PAT甲级 A1031
  19. Unbuntu22.04安装教程以及Unbuntu下C++环境的配置
  20. 重装java后hadoop配置文件的修改

热门文章

  1. STM32F103最小系统图例
  2. 语言总结—C/C++
  3. 使用JavaScript在浏览器中进行图像分类
  4. javascript实现 京东淘宝等商城的商品图片大图预览功能
  5. MICCAI 2023 肝脏病变诊断挑战赛 (奖金丰厚)
  6. 魔百盒CM201-1-CH_S905L3(B)_安卓4.4.2_当贝桌面线刷固件包
  7. java addall equals_java.util.Collections.addAll()方法实例
  8. 51节,致敬社区最可爱的人!全场5.1折,还有券,还有好吃的!!!
  9. 2021年中国电力市场交易情况:交易量增长,占全社会用电量的比重增大[图]
  10. 教你怎样同时查询中通快递多个未签收单号的物流信息