Android startForegroundService与startForeground

启动service

service启动有四种形式。

1.显示启动(如直接按service的全路径启动)

2.隐示启动(如通过intent-filter的action标签启动)

3.通过bindservice显示启动。

4.通过bindservice隐示启动。

Demo

创建一个service的子类,如

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;public class ForceGroundServer extends Service {private static final String TAG = "ForceGroundServer";@Nullable@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, "onBind: ");return null;}@Overridepublic boolean onUnbind(Intent intent) {Log.d(TAG, "onUnbind: ");return super.onUnbind(intent);}@Overridepublic void onCreate() {super.onCreate();Log.d(TAG, "onCreate: ");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {sendNotification();}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, "onStartCommand: ");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}private final String CHANNEL_ID = "TestID";@RequiresApi(api = Build.VERSION_CODES.O)private void sendNotification() {NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "TEstName", NotificationManager.IMPORTANCE_HIGH);channel.enableLights(true);//设置提示灯channel.setLightColor(Color.BLUE);//设置提示灯颜色channel.setShowBadge(true);//显示logochannel.setDescription("test");//设置描述channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);//锁屏可见manager.createNotificationChannel(channel);Notification testNotification = new Notification.Builder(this).setChannelId(CHANNEL_ID).setContentText("服务已经至于前台了").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).build();//id 不能是0startForeground(1, testNotification);}
}

显示启动

    private final static String TARGET_APP_PACKAGE = "com.example.mycolorpicker";private final static String TARGET_SERVICE_NAME = TARGET_APP_PACKAGE + ".ForceGroundServer";private final static String TARGET_SERVICE_ACTION = TARGET_SERVICE_NAME + ".action";private void startServerVisible() {Intent intent = new Intent();intent.setComponent(new ComponentName(TARGET_APP_PACKAGE,  TARGET_SERVICE_NAME));if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startForegroundService(intent);Log.d(TAG, "startForegroundService");} else {startService(intent);Log.d(TAG, "startService");}}

隐示启动

    private void startServerHide() {Intent intent = new Intent();intent.setPackage(TARGET_APP_PACKAGE);intent.setAction(TARGET_SERVICE_ACTION);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {startForegroundService(intent);} else {startService(intent);}}

设置前台服务

首先需要在Manifest中声明权限需求。

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

若无此权限声明,系统会抛SecurityException异常

                                                                                                    java.lang.RuntimeException: Unable to create service com.example.mycolorpicker.ForceGroundServer: java.lang.SecurityException: Permission Denial: startForeground from pid=12931, uid=10247 requires android.permission.FOREGROUND_SERVICE

上面通过startForegroundService启动了servervice,会执行Service的Oncreate和OnStartCommand,service需要在5秒内调用startForeground,否则系统就会报TimeExceptio异常,app闪退。

ndroid.app.ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{263b8f7 u0 com.example.mycolorpicker/.ForceGroundServer}at android.app.ActivityThread.throwRemoteServiceException(ActivityThread.java:2046)at android.app.ActivityThread.access$2900(ActivityThread.java:275)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2271)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loopOnce(Looper.java:211)at android.os.Looper.loop(Looper.java:300)at android.app.ActivityThread.main(ActivityThread.java:8291)at java.lang.reflect.Method.invoke(Native Method)

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

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

相关文章

Python程序设计 字典

教学案例十 字典 1. 判断出生地 sfz.txt文件中存储了地区编码和地区名称 身份证的前6位为地区编码&#xff0c;可以在sfz.txt文件中查询到地区编号对应的地区名称 编写程序&#xff0c;输入身份证号&#xff0c;查询并显示对应的地区名称 若该地区编码不在文件中&#xff0c;…

【Redis(1)】Redis数据类型及使用场景

1.Redis是什么&#xff1f; Redis是一个开源的&#xff0c;高性能的键值存储数据库。它以其出色的性能、丰富的数据类型和原子操作而闻名。Redis支持多种类型的数据结构&#xff0c;如字符串、列表、集合、有序集合和哈希&#xff0c;使其成为存储各种数据的理想选择。 主要特…

SQVI创建以及生成程序

SAP数据快速查询工具&#xff1a;Sqvi-QuickView 项目实施&运维阶段&#xff0c;为了快速获取一些透明表数据&#xff0c;一开始接触项目肯定会通过大量的数据表查找&#xff0c;然后线下通过EXCEL通过VLOOKUP进行数据关联&#xff0c;这种方式在关联数据较少的情况比较适应…

齐超:思颜肌密从单科特长生向全科学霸进化

“从单科特长生向全科学霸进化”。 中国化妆品行业发展至今&#xff0c;走过了线下渠道蓬勃发展的时代&#xff0c;也经历了电商渠道的黄金时代&#xff0c;继而迈入当下的直播时代。而在每一个时代的转折点上&#xff0c;思颜肌密始终在行业前列&#xff0c;跨越一个个生命周…

书生·浦语大模型实战营Day04OpenXLab 部署

书生浦语大模型实战营Day04OpenXLab 部署 如何在 OpenXLab 部署一个 InternLM2-7B chat 的应用。 OpenXLab浦源平台介绍 OpenXLab 浦源平台以开源为核心&#xff0c;旨在构建开源开放的人工智能生态&#xff0c;促进学术成果的开放共享。OpenXLab面向 AI 研究员和开发者提供…

FPGA - ZYNQ Cache一致性问题

什么是Cache&#xff1f; Cache是一种用来提高计算机运行速度的一种技术。它是一种小而快的存储设备&#xff0c;位于CPU与内存之间&#xff0c;用于平衡高速设备与低速设备之间的速度差异。Cache可以存储常用的数据或指令&#xff0c;以便CPU更快地获取&#xff0c;从而减少对…

竞逐智能家居大模型:美的“蓄力”,海尔“疾行”

配图来自Canva可画 随着ChatGPT火热出圈&#xff0c;AI大模型便成为了各行各业必争的高地。“BAT”等互联网大厂、华为、小米等通讯巨头&#xff0c;以及一些垂直AI公司&#xff0c;都开始在大模型市场积极布局。众所周知&#xff0c;发展大模型的关键在于应用场景的落地&…

OceanBase v4.2特性解析:逻辑计划管理

逻辑计划管理在OceanBase 4.1不足之处 复杂计划的可读性不好 以下计划为例&#xff0c;包含多达45个算子&#xff0c;使得用户难以清晰地阅读和理解整个计划。例如&#xff0c;在识别9号JOIN算子的左右子计划时&#xff0c;用户往往需要对照计划表数空格来确认。 |ID|OPERATO…

Redis-cluster集群架构

一、集群架构 上述集群架构师一个由多个主从节点群组成的分布式服务器&#xff0c;具有复制、高可用和分片的特性。Redis集群不需要sentine哨兵也能完成节点移除和故障转移。官方文档称可以扩展上万个节点。推荐不超过1000个&#xff1b;从节点只担任备份的角色&#xff0c;不承…

MySQL基础篇总结

参考&#xff1a;黑马程序员MySQL基础视频链接 数据库基本操作 启动与停止 1.第一种方式&#xff1a; 1>以管理员身份运行cmd 2>在命令行窗口中输入: 启动:net start mysql80停止:net stop mysql80 2.第二种方式: 1>WinR快捷方式打开如下&#xff1a; 输入&#…

【可视化大屏开发】19. 加餐-百度地图API实现导航加线路热力图

需求 Web端使用场景中会涉及到地图导航路线情况&#xff0c;并利用热力图显示路况信息。 实现效果如下&#xff1a; 输入起始地点&#xff0c;选择并开始导航 最终效果 思路步骤 利用百度地图API显示地图交通拥堵情况的热力图&#xff0c;需要按照以下步骤进行开发 步骤1&a…

9.Godot数组|遍历|静态变量|对象|调试

数组和字典的遍历 数组的概念 数组是一组数据的集合。在程序中负责批量处理数据。数组中的元素可以包括各个类型的数据&#xff0c;也可以对数组内数据类型进行限定。可以通过 数组名【数字】 的形式来访问数组元素&#xff0c;数字 0 代表数组的第一个元素。数组可以通过调用…

【大数据】TiDB: A Raft-based HTAP Database

文章目录 数据库知识介绍数据库系统的ACID特性分布式系统和CAP理论关系型数据库与非关系型数据库关系型数据库非关系型数据库 OldSQL、NoSQL、NewSQLOldSQLNoSQLNewSQL OLTP、OLAP、HTAP 前言&#xff1a;为什么选择TiDB学习&#xff1f;pingCAP介绍TiDB介绍TiDB的影响力TiDB概…

Java发送邮件 启用SSL

使用的maven依赖: <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.4.7</version> </dependency> 配置文件mail.properties如下: # 邮箱配置 email.username=your-email@exa…

[Java EE] 多线程(三):线程安全问题(上)

1. 线程安全 1.1 线程安全的概念 如果多线程环境下代码运行的结果不符合我们的预期,则我们说存在线程安全问题,即程序存在bug,反之,不存在线程安全问题. 1.2 线程不安全的原因 我们下面举出一个线程不安全的例子:我们想要在两个线程中对count进行操作 public class Demo9 …

ubuntu sysctl.conf net.core nofile

Ubuntu 20.04.4 修改系统的文件描述符限制 设置网络接收缓冲区 Configuring open file limits UDP buffe echo "* soft nofile 32000000" >> /etc/security/limits.conf echo "* hard nofile 128000000" >> /etc/security/limits.conf echo …

山东大学操作系统实验一(Linux虚拟机实现)

目录 实验题目 实验要求 示例程序 主程序 头文件 重点代码解析 一、main函数的参数 参数介绍 参数输入方式 本块代码 二、信号处理 本块代码 原理介绍 实现效果 三、kill函数 功能介绍 使用方式 本块代码 四、头文件处理 本块代码 代码作用 实验程序 …

ELK 与 EFK的介绍和对比

ELK 与 EFK的介绍和对比 ELK 和 EFK 分别是两种开源日志管理和分析平台的缩写&#xff0c;它们均基于 Elasticsearch、Kibana 这两个核心组件&#xff0c;但在日志收集阶段采用了不同的工具。下面详细解释这两个术语&#xff1a; ELK Stack ELK 是指 Elasticsearch, Logstas…

微调Llama3实践并基于Llama3构建心理咨询EmoLLM

Llama3 Xtuner微调Llama3 EmoLLM 心理咨询师

【嵌入式DIY实例】-称重计

DIY称重计 文章目录 DIY称重计1、硬件准备1.1 HX711 称重传感器模块2、硬件接线原理图3、代码实现在本文中,我们将使用数字体重秤 HX711 称重传感器模块来实现一个简易的称重计。 HX711 模块非常适合测量重量、力或任何其他可以以克为单位的东西。 该模块易于使用,可以连接到…