Android --- Android 8.0之后不允许在后台启动一个服务的解决方案

从Android 8.0(API级别26)开始,Google 引入了后台服务限制,目的是为了改善系统资源管理和用户体验。这些限制导致在后台运行的服务可能会被系统认为是无效的,从而限制或者终止这些服务。针对这个问题,可以考虑以下几种解决方案:

  1. 使用 JobIntentService

JobIntentService 是 Android 提供的一个服务类,专门用于处理那些需要长时间运行的后台任务,它能够利用系统的 JobScheduler API,在适当的时候执行任务,而不会像普通服务那样直接在后台无限期运行。

如何使用 JobIntentService:

创建一个继承自 JobIntentService 的类,并实现 onHandleWork() 方法来处理任务。
将任务逻辑放在 onHandleWork() 方法中。
调用 enqueueWork() 方法启动服务。

示例代码:

public class MyJobIntentService extends JobIntentService {static final int JOB_ID = 1000;public static void enqueueWork(Context context, Intent work) {enqueueWork(context, MyJobIntentService.class, JOB_ID, work);}@Overrideprotected void onHandleWork(@NonNull Intent intent) {// 处理后台任务逻辑}
}

在你的应用中,通过调用 enqueueWork() 方法来启动 JobIntentService,系统会负责调度适当的时机执行任务。

Intent workIntent = new Intent(context, MyJobIntentService.class);
MyJobIntentService.enqueueWork(context, workIntent);
  1. 使用 Foreground Service

如果你的应用确实需要在后台长时间运行,并且需要执行一些重要的任务,可以将服务设置为前台服务(Foreground Service)。前台服务会在状态栏显示一个持续的通知,用户可以随时看到服务正在运行。

如何使用 Foreground Service:

将服务设置为前台服务,使用 startForeground() 方法,在通知栏显示一个通知。
在适当的时候,调用 stopForeground() 方法取消前台状态。

示例代码:

public class MyForegroundService extends Service {private static final int NOTIFICATION_ID = 1;private static final String CHANNEL_ID = "ForegroundServiceChannel";@Overridepublic void onCreate() {super.onCreate();createNotificationChannel();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 在服务中执行耗时操作// 设置为前台服务startForeground(NOTIFICATION_ID, getNotification());// 返回 START_NOT_STICKY 以便服务被终止后不会自动重启return START_NOT_STICKY;}@Overridepublic void onDestroy() {super.onDestroy();// 停止前台服务stopForeground(true);}private void createNotificationChannel() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel channel = new NotificationChannel(CHANNEL_ID,"Foreground Service Channel",NotificationManager.IMPORTANCE_DEFAULT);NotificationManager manager = getSystemService(NotificationManager.class);manager.createNotificationChannel(channel);}}private Notification getNotification() {Intent notificationIntent = new Intent(this, MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this,0, notificationIntent, 0);NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID).setContentTitle("Foreground Service").setContentText("Service is running in foreground").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);return builder.build();}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}
}

在 AndroidManifest.xml 文件中声明服务:

<serviceandroid:name=".MyForegroundService"android:enabled="true"android:exported="false" />

总结

选择适当的解决方案取决于你的应用需求和任务的性质。对于后台需要长时间运行的任务,推荐使用 JobIntentService 或者 Foreground Service。这些方法都能在一定程度上规避 Android 8.0 引入的后台服务限制,并提供了更好的用户体验和系统资源管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI&#xff1a;译作外部中断/事件控制器&#xff0c;STM32的众多片上外设之一&#xff0c;能够检测外部输入信号的边沿变化并由此产生中断。 例如&#xff0c;在检测按键时&#xff0c;按键按下时会使电平产生翻转&#xff0c;因此可以使用EXTI来读取按下时…

线上线下一体开源的Hugging Face?| 这些问题不可不看……

7月&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;在上海盛大启幕&#xff0c;以“以共商促共享&#xff0c;以善治促善智”为主题进行展览&#xff0c;OpenCSG首次亮相“CSGHub和StarShip”两大产品&#xff0c;全方位展现公…

HTML5新增的input元素类型:number、range、email、color、date等

HTML5 大幅度地增加与改良了 input 元素的种类&#xff0c;可以简单地使用这些元素来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 到目前为止&#xff0c;大部分浏览器都支持 input 元素的种类。对于不支持新增 input 元素的浏览器&#xff0c;input 元素被统一…

kotlin数据容器

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 容器是用于存放数据的载体。容器分为数组、集合。 Kotlin作为一门全新的语言&#xff0c;肯定还是要有自己的容…

网优学习干货:xx5G速率优化现场实战版

速率概述 无线网络仍然是5G网络能力最容易受限的环节&#xff0c;无线网络技术的应用将最终决定5G网络能力的木桶深度。移动通信中传统关键技术在5G将会继续使用。5G NR在继承了LTE原有部分技术基础上&#xff0c;采用了一些技术演进和新技术创新。比如NR继承了LTE的OFDM和SC-…

ArduPilot开源飞控之AP_Mount_Topotek

ArduPilot开源飞控之AP_Mount_Topotek 1. 源由2. 框架设计3. 重要函数3.1 动态过程3.1.1 AP_Mount_Topotek::update3.1.2 AP_Mount_Backend::calculate_poi 3.2 基础能力3.2.1 AP_Mount_Topotek::healthy3.2.2 AP_Mount_Topotek::has_pan_control 3.3 设备功能3.3.1 AP_Mount_T…

深入剖析 Java 中 Spring Bean 的生命周期

在 Java 开发中&#xff0c;Spring 框架是广泛使用的企业级应用开发框架。理解 Spring Bean 的生命周期对于开发者来说至关重要&#xff0c;这也是面试中经常会被问到的重要知识点。 一、Spring Bean 的定义与创建 Spring Bean 是由 Spring 容器管理的对象。Spring 容器在创建…

Winform打印编程基础

1、目的 进行打印设置、打印预览、及实现打印功能 2、代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Printing; using System.IO; using System.Linq; using System.Te…

python字节串与字符串对比

Python中的字节串&#xff08;byte strings&#xff09;是专门用于处理二进制数据的数据类型。它们与字符串&#xff08;strings&#xff09;在多个方面存在显著的区别&#xff0c;尽管它们在某些方面看起来很相似。下面将详细说明字节串的特点及其与字符串的区别。 字节串&am…

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10&#xff08;x64&#xff09;&#xff0c;Python 3.8&#xff08;x64&#xff09;&#xff0c;PyCharm Community Edition 2020.3.2&#xff08;x64&#xff09; 三、实验内容 现有列表hight…

初学SpringMVC之过滤器解决乱码

写个 login.jsp 页面 提交的 method 一般为 post&#xff08;写 get 不安全&#xff0c;地址栏上会显示&#xff09; action 表示提交后跳转的地址 &#xff08;不直接写控制器里的路径是因为配置 Tomcat 时设置了前缀路径&#xff0c;默认走 http://localhost:8080&#xf…

市面上的护眼台灯哪个牌子最好?分享学生护眼台灯十大排名

家长们对孩子的用眼健康很重视&#xff0c;为什么&#xff1f;现在是科技电子时代&#xff0c;人们对电子屏幕的依赖性高&#xff0c;小孩子年纪小&#xff0c;眼部还处于正在发育的阶段&#xff0c;他们在学校中长时间的学习读写&#xff0c;用眼时间长。而且随着科技渗入教学…

如何选择小型超声波清洗机? 2024年值得买的四款眼镜清洗机总结

久了不擦洗的眼镜&#xff0c;往往会滋生很多细菌病毒&#xff0c;久而久之就会影响到视力和眼睛健康。而超声波清洗机作为一款高效清洁物品&#xff0c;可以帮助人们快速且深度地清洁眼镜&#xff0c;很多清洗机使用久一点清洁力就减弱了&#xff0c;所以要找一款性价比高的清…

为什么导游强制消费现象难以根除?从8个方面分析原因

导游强制消费现象难以根除的原因是多方面的&#xff0c;涉及旅游业的结构、经济激励、法律执行以及消费者行为等复杂因素&#xff1a; 1. 行业竞争与低成本策略 旅游市场竞争激烈&#xff0c;一些旅行社为了吸引顾客&#xff0c;提供低于成本的团费&#xff0c;通过购物回扣来…

【Java EE】统一功能返回

一、拦截器 1.1 拦截器的作用 在对于数据库进行增删查改的时候&#xff0c;如果当前页面不检查用户是否登录&#xff0c;然后就能操作成功是不合理的&#xff0c;解决方法有两个&#xff1a; 对于已经写好的每个接口都加上一个判断&#xff0c;从Session中获取用户信息&…

CSS 中的 ::before 和 ::after 伪元素

目录 一、CSS 伪元素 二、::before ::after 介绍 1、::before 2、::after 3、content 常用属性值 三、::before ::after 应用场景 1、设置统一字符 2、通过背景添加图片 3、添加装饰线 4、右侧展开箭头 5、对话框小三角 6、插入icon图标 一、CSS 伪元素 CSS伪元…

Spring Boot:连接MySQL错误Public Key Retrieval is not allowed

环境&#xff1a; MySQL版本&#xff1a;8.0.17 SpringBoot版本&#xff1a;2.5.15 解决 解决方式很简单&#xff0c;在数据库配置连接字符串spring.datasource.url末尾添加&allowPublicKeyRetrievaltrue即可&#xff0c;如下图&#xff1a; 重新启动&#xff0c;恢复正常…

kafka面试题(基础-进阶-高阶)

目录 Kafka 基础篇 1.Kafka 的用途有哪些?使用场景如何? 2.Kafka 中的ISR、AR 又代表什么?ISR 的伸缩又指什么 3.Kafka 中的 HW、LEO、LSO、LW 等分别代表什么? 4.Kafka 中是怎么体现消息顺序性的? 5.Kafka 中的分区器、序列化器、拦截器是否了解?它们之间的处理顺序…

django招聘数据分析与可视化管理系统-计算机毕业设计源码55218

摘要 随着互联网的迅速发展&#xff0c;招聘数据在规模和复杂性上呈现爆炸式增长&#xff0c;对数据的深入分析和有效可视化成为招聘决策和招聘管理的重要手段。本论文旨在构建一个基于Python的招聘数据分析与可视化管理系统。 该平台以主流招聘平台为数据源&#xff0c;利用Py…

四元数和旋转矩阵的求导

四元数的导数 四元数关于时间求导的推导 本质&#xff1a; 求导的定义是函数值的微增量关于自变量的微增量的极限。表示旋转的单位四元数作差后&#xff0c;其不再是单位四元数&#xff0c;也就不是旋转四元数了。单位四元数作差后&#xff0c;得到是被减四元数所在空间的切空…