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

2023-05-16

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

会导致问题。

前后台服务的一些区别:

7691957536a2

有人可能会问,后台服务我们可以自己创建 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 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括:

7691957536a2

图 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);

}

}

……

……

…….

}

引用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 8.0手机开服务端,Android 8.0 + Service开启方式兼容处理 的相关文章

  • 阿里巴巴集团告别 CTO?

    整理 苏宓 出品 CSDN xff08 ID xff1a CSDNnews xff09 近日 xff0c 据雪豹财经社 界面新闻等多个媒体报道 xff0c 阿里内部开始了新一轮的组织架构调整 xff0c 其中原先 CTO 线中的业务中台 供
  • sqlerver2008重启计算机,SQL SERVER 2008 R2安装的时候提示“该实例名称MSSQLSERVER已在使用...

    SQL SERVER 2008安装的时候提示 该实例名称已在使用 解决办法 冷雨玫瑰 新浪博客 和这文章描述差很少 http blog sina com cn s blog 672b419f010158ld htmlhtml 本想按照此文删
  • 因变量是连续变量spss里面用什么模型做回归

    如果因变量是连续变量 xff0c 在 SPSS 中可以使用线性回归模型来做回归分析
  • NEO4J节点中文名称显示不完整

    NEO4J 是一种图形数据库管理系统 xff0c 它可以存储和管理大量的关系数据 在 NEO4J 中 xff0c 节点是图中的基本单元 xff0c 表示一个实体 如果你在 NEO4J 中的节点中文名称显示不完整 xff0c 可能是因为节点中
  • 怎样设计celery任务在调用 revoke时记录任务状态

    你可以通过在任务函数中手动记录任务状态并在 revoke 时进行更新 可以使用数据库 如 MySQL PostgreSQL 或 MongoDB 存储任务状态信息 xff0c 然后在 revoke 时对其进行更新 下面是一个示例代码 xff1
  • Flutter中,怎么给Scaffold设置背景色

    在Flutter中 xff0c 可以通过在Scaffold的decoration属性中设置BoxDecoration并设置其color属性来设置Scaffold的背景色 例如 xff1a span class hljs built in S
  • 怎么将微信小程序项目转为uniapp项目

    将微信小程序项目转换为uni app项目需要以下几个步骤 安装uni app开发工具 xff1a HBuilderX在HBuilderX中创建一个新的uni app项目将微信小程序的代码复制到uni app项目的相应文件夹中在uni app
  • 介绍matlab的概要和功能介绍

    Matlab Matrix Laboratory 是一个由MathWorks公司开发的商业数学软件 xff0c 它提供了一系列的数学函数和算法 xff0c 可以帮助用户解决复杂的科学计算问题 主要功能包括数值计算 绘图和可视化 编程和应用程
  • 可以就无线定位的研究前沿给出一些介绍吗

    答 xff1a 当前 xff0c 无线定位技术的研究受到了越来越多的关注 它可以提供高精度的位置推断 xff0c 可以用于实时跟踪 边缘计算 导航和室内定位等许多应用场景 近年来 xff0c 基于深度学习的无线定位算法被广泛应用 xff0c
  • 生成十六进制数转二进制数的汇编语言

    以下是一个将十六进制数转换为二进制数的 x86 汇编语言程序的示例 xff1a span class hljs meta section span data span class hljs comment 定义要转换的十六进制数 span
  • 大模型扎堆涌现,AIGC 的价值到底是什么?

    ChatGPT 在 2023 年初爆红之后 xff0c AIGC 引发了各行业的热切关注 xff0c 国内的各类大模型不断推出 近日 xff0c 科大讯飞对外发布了 讯飞星火认知大模型 xff0c 现场不仅实测了文本生成 语言理解 知识问答
  • JAVAer的学习路径

    非常抱歉 我不能用中文回答您的问题 但是 我可以用英文为您介绍学习 Java 的一些建议 如果您是刚刚开始学习 Java 那么建议您从以下几个方面入手 安装 Java 开发环境 JDK 并配置环境变量 这样才能在电脑上开始写 Java 程序
  • 三阶线性自抗扰控制 (LADRC)的原理和推导过程

    三阶线性自抗扰控制 LADRC 是一种线性控制策略 xff0c 它通过计算系统的状态信息来生成控制输入 该策略的目的是通过使用自抗扰 即系统的内部参数 来实现系统的稳定 xff0c 并通过减少噪声的影响来提高系统的性能 在推导LADRC控制
  • 自制aruco识别码

    要自制Aruco识别码 xff0c 你可以使用Aruco库中提供的工具生成自定义识别码 这些工具可以在多种编程语言 如C 43 43 xff0c Python 中使用 xff0c 生成满足你的特定要求的识别码 一旦生成了识别码 xff0c
  • 无人机领域常用的控制算法有哪些

    无人机控制算法常用的有基于模型的控制 Model based Control 基于模糊控制 Fuzzy Control 基于模式识别 Pattern Recognition 神经网络控制 Neural Network Control 基于深
  • Docker创建Mysql容器,并添加root密码验证与更多用户

    使用代码 xff1a 创建Docker的mysql容器 span class token function sudo span span class token function docker span pull mysql span cl
  • 安卓 qemu 运行linux,Qemu运行linux 4.9

    1 git clone最新的Qemu代码到本地 xff1a ubuntu 64 ubuntu X556UB Qemu git clone git git qemu project org qemu git 正克隆到 39 qemu 39 r
  • android os 小米系统,小米全新 OS 自研底层,要挑战最强的 iOS 系统

    小米全新 OS 自研底层 xff0c 要挑战最强的 iOS 系统 2020 04 27 20 29 47 3点赞 1收藏 6评论 4月27日下午消息 xff0c 小米十年梦想之作全新 MIUI 12 操作系统正式亮相 xff0c 这款全新的
  • php函数strrchr,php strrchr函数怎么用

    PHP strrchr函数用于查找指定字符在字符串中的最后一次出现 xff0c 其语法是strrchr string char xff0c 参数string必需 xff0c 是规定要搜索的字符串 xff1b char必需 xff0c 是规定
  • mysql putty,Mysql和Putty – ERROR 1044(42000):拒绝用户访问

    我在命令行级别的mysql相当新 不幸的是 我已经设置的任务意味着我必须使用命令行 我通过PuTTY访问学校服务器 登录没有问题他们输入mysql p 登录正常 但是当我去创建数据库时 我得到了1044错误 我也试过root但也没有运气 l

随机推荐