7.0 android中Service的基础知识

service的定义:

Service 是一个在后台执行长时间运行操作而不提供用户界面的组件。

允许在用户没有与应用交互时操作,或者执行一些用户交互之外的操作,如音乐播放、文件上传、文件下载等。
Service的使用不影响用户的交互,且由其他组件(如Activity、Fragment等)启动

Service必须在Manifest中进行定义。

service的特点:

  • 适合执行不需要和用户交互而且还要求长期运行的任务
  • 依赖于创建Service时所在的应用程序进程
  • 默认运行在主线程当中的,不能直接执行耗时操作,需要开启子线程

Service 直接启动

启动

通过startService启动Service

停止

通过stopService停止Service
在Service中可以通过stopSelf()停止Service。

示例

下列代码示例中,设置两个按钮执行开始Service和结束Service

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)startServiceBtn.setOnClickListener {val intent = Intent(this, MyService::class.java)startService(intent) // 启动Service}stopServiceBtn.setOnClickListener {val intent = Intent(this, MyService::class.java)stopService(intent) // 停止Service}}}

Service 绑定启动

假设执行一个后台下载的功能

定义Service

  • 在service中设置一个继承Binder()的类,并在Service中创建变量mBinder为其实例。

  • 在Service中的方法onBind中返回mBinder,用于Activity与Service之间绑定。

class MyService : Service() {private val mBinder = DownloadBinder()class DownloadBinder : Binder() {fun startDownload() {Log.d("MyService", "startDownload executed")}fun getProgress(): Int {Log.d("MyService", "getProgress executed")return 0}}override fun onBind(intent: Intent): IBinder {return mBinder}...
}

绑定

在Activity中,设置Service中定义的Binder类,并通过匿名类ServiceConnection中的onServiceConnected,设置为绑定运行的Service。

启动

在Activty中通过bindService进行绑定启动Service,

停止

通过unbindService进行解绑停止Service的操作。

class MainActivity : AppCompatActivity() {lateinit var downloadBinder: MyService.DownloadBinderprivate val connection = object : ServiceConnection {override fun onServiceConnected(name: ComponentName, service: IBinder) {downloadBinder = service as MyService.DownloadBinderdownloadBinder.startDownload()downloadBinder.getProgress()}override fun onServiceDisconnected(name: ComponentName) {}}override fun onCreate(savedInstanceState: Bundle?) {...bindServiceBtn.setOnClickListener {val intent = Intent(this, MyService::class.java)bindService(intent, connection, Context.BIND_AUTO_CREATE) // 绑定Service}unbindServiceBtn.setOnClickListener {unbindService(connection) // 解绑Service}}}

注意

虽然每调用一次startService()方法,onStartCommand()就会执行一次,但实际上每个Service只会存在一个实例。所以不管你调用了多少次startService()方法,只需调用一次stopService()或stopSelf()方法,Service就会停止。

在同一个Activity中,如果同时通过startService、bindService启动同一个Service,停止Service的话,需要同时通过unbindService和stopService对Service进行解绑和停止的操作。

生命周期

对于Service的生命周期,
方法onCreate只在第一次创建时调用;

方法onStartCommand在使用startService启动Service都会调用;

方法onBind在使用bindService启动ServiceService都会调用。

也就是说,使用不同的方法启动Service,调用Service的生命周期的方法是不一样的,如果需要在Service每次启动时执行一定操作,要注意方法是否调用正确。

前台service

从Android 8.0系统开始,只有当应用保持在前台可见状态的情况下,Service才能保证稳定运行,一旦应用进入后台之后,Service随时都有可能被系统回收。如果你希望Service能够一直保持运行状态,就可以考虑使用前台Service。

class MyService : Service() {...override fun onCreate() {super.onCreate()Log.d("MyService", "onCreate executed")val manager = getSystemService(Context.NOTIFICATION_SERVICE) asNotificationManagerif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val channel = NotificationChannel("my_service", "前台Service通知",NotificationManager.IMPORTANCE_DEFAULT)manager.createNotificationChannel(channel)}val intent = Intent(this, MainActivity::class.java)val pi = PendingIntent.getActivity(this, 0, intent, 0)val notification = NotificationCompat.Builder(this, "my_service").setContentTitle("This is content title").setContentText("This is content text").setSmallIcon(R.drawable.small_icon).setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.large_icon)).setContentIntent(pi).build()startForeground(1, notification)}...
}

IntentService

Service中的代码都是默认运行在主线程当中的,如果直接在Service里处理一些耗时的逻辑,就很容易出现ANR(Application Not Responding)的情况。
为了可以简单地创建一个异步的、会自动停止的Service,Android专门提供了一个IntentService类

class MyIntentService : IntentService("MyIntentService") {override fun onHandleIntent(intent: Intent?) {// 打印当前线程的idLog.d("MyIntentService", "Thread id is ${Thread.currentThread().name}")}override fun onDestroy() {super.onDestroy()Log.d("MyIntentService", "onDestroy executed")}}

实际其相对于如下代码:

class MyService : Service() {...override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {thread {// 处理具体的逻辑stopSelf()}return super.onStartCommand(intent, flags, startId)}
}

步骤

①先调用父类的构造函数
②在子类中实现onHandleIntent()这个抽象方法,这个方法中可以处理一些耗时的逻辑,而不用担心ANR的问题,因为这个方法已经是在子线程中运行的了

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

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

相关文章

adb dump当前可见的窗口

1、窗口信息 adb shell dumpsys window windows > w.txt2、dump当前可见的窗口activity windows系统 adb shell dumpsys activity | findStr mFocusmac系统 adb shell dumpsys activity | grep mFocus3、dump当前处于栈顶的activity windows系统 adb shell dumpsys activi…

Vue3【七】setup的语法糖setup简写方法

Vue3【七】setup的语法糖setup简写方法 Vue3【七】setup的语法糖setup简写方法 使用script标签式写法称为setup语法糖 组件名称默认位文件名 export 的内容可以省略 案例截图 案例目录 案例代码 Person.vue <template><div class"person"><h1>我…

这才是计科之 Onix XV6 源码分析(1、XV6-x86的启动)

这才是计科之 Onix & XV6 源码分析&#xff08;1、XV6-x86的启动&#xff09; 前言 Onix是一款相对于XV6来说功能更为健全的单核OS&#xff0c;由于功能更加完善&#xff0c;Onix也更加复杂。代码阅读起来会比较绕。 XV6是一款简单易读的多核操作系统&#xff0c;但其功…

【JMeter接口测试工具】第一节.JMeter简介和安装【入门篇】

文章目录 前言一、JMeter简介 1.1 JMeter基本介绍 1.2 JMeter优缺点二、JMeter安装 2.1 JMeter安装步骤 2.2 JMeter环境配置三、项目介绍 3.1 项目简介 3.2 API接口清单总结 前言 一、JMeter简介 1.1 JMeter基本介绍 JMeter 是 Apache 组织使用…

js模块(module)和导入,导出(import,export)

什么是模块&#xff08;module&#xff09; 一个模块&#xff08;module&#xff09;就是一个文件。一个脚本就是一个模块。就这么简单。 模块可以相互加载&#xff0c;并可以使用特殊的指令 export 和 import 来交换功能&#xff0c;从另一个模块调用一个模块的函数或者变量…

mysql(54) : dbcp多实例使用

mysql版本: 8.0.11 java版本: 8 maven版本: 3.6.3 mave依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency><dependency><groupId&…

使用C#反射中的MAKEGENERICTYPE函数,来为泛型方法和泛型类指定(泛型的)类型

MakeGenericType 是一个在 C# 中用于创建开放类型的实例的方法。开放类型是一种未绑定类型参数的泛型类型。当你有一个泛型类型定义&#xff0c;并且想要用特定的类型实例化它时&#xff0c;你可以使用 MakeGenericType 方法。 public Type MakeGenericType (params Type[] ty…

Windows API 开发桌面应用程序,在窗口按下鼠标左键不放可以拖图,并且拖图期间鼠标图标变成手掌

在Windows API中&#xff0c;要实现鼠标左键按下并拖动以移动窗口中的某个图形&#xff0c;并且同时改变鼠标图标为“手掌”形状&#xff08;这通常指的是“拖动”或“移动”的图标&#xff09;&#xff0c;你需要执行几个步骤。 以下是一个基本的步骤指南&#xff0c;用于在W…

java---程序逻辑控制(详解)

目录 一、概述二、顺序结构三、分支结构3.1 if语句3.1.1 语法格式13.1.2 语法格式23.1.3 语法格式3 3.2 练习3.2.1 判断一个数字是奇数还是偶数3.2.2 判断一个数字是正数&#xff0c;负数&#xff0c;还是零3.2.3 判断一个年份是否为闰年 3.3.switch语句 四、循环结构4.1 while…

部署Jar包教程

文章目录 引言I 编写脚本1.1 启动1.2 关闭1.3 SSH上传jar包II 打包2.1 build中的plugins中标签的含义2.2 jar中没有主清单属性引言 I 编写脚本 1.1 启动 chmod a+x start.sh #!/bin/bash nohup java -Xms1024m -Xmx1024m -Xmn256m -XX:MaxDirectMemorySize=5G -jar SOAP-0.…

在Linux平台下使用 .NET Core技术的UI方案

在Linux平台下使用 .NET Core 实现精美的界面&#xff0c;你可以考虑以下几种方案&#xff1a; 1. 使用 Avalonia Avalonia 是一个跨平台的 .NET UI 框架&#xff0c;支持 Windows、macOS 和 Linux。它类似于 WPF&#xff0c;但能够在多个平台上运行。 安装 Avalonia 你可以…

Flutter vscode环境如何进行真机测试

目录 1. 准备工作 1.1 安装Flutter和VS Code 1.2 安装必要的VS Code扩展 1.3 手机设置 2. 配置VS Code调试环境 3. 手机如何退出开发者模式 1. 准备工作 1.1 安装Flutter和VS Code 确保你已经在电脑上安装了Flutter SDK和VS Code。如果还没有&#xff0c;可以参考以下指…

项目文章 | Nature Commun蓝藻转录因子PhoB对磷/铁的营养元素限制的调控机制

近日&#xff0c;华中师范大学邱保胜教授团队在《Nature Communications》发表题为“Phosphorus deficiency alleviates iron limitation in Synechocystis cyanobacteria through direct PhoB-mediated gene regulation”文章&#xff0c;其重点研究了Synechocystis蓝藻转录因…

硬件产品经理

边端协调管理平台 主页模型管理配置管理设备管理设备检测组态数据服务传输通道服务 定义与范围&#xff1a; 边测&#xff1a;通常指的是边缘计算的测试&#xff0c;这里的“边缘”可以理解为离用户更近的计算节点或设备&#xff0c;如小 型数据中心、具有计算能力的小基站等。…

深度学习课程设计:构建未来的教育蓝图

深度学习课程设计&#xff1a;构建未来的教育蓝图 在近年来&#xff0c;深度学习已经从一项前沿的技术发展成为计算机科学领域不可或缺的一部分。随着其在多个行业中的应用日益增多&#xff0c;对深度学习教育的需求也在急剧上升。对于计划将深度学习纳入学术课程的教育者而言…

【WRF理论第二期】运行模型的基础知识

WRF理论第二期&#xff1a;运行模型的基础知识 1 Basics for Running the Model2 Geogrid程序2.1 Geogrid2.2 Terrestrial Input Data 3 Ungrid程序3.1 Ungrid3.2 Intermediate Files3.3 Required Fields 4 Metgrid程序参考 官方介绍-Basics for Running the Model 本博客主要…

耐用好用充电宝有哪些?畅销排行榜前四款充电宝推荐

在日常生活中&#xff0c;一款耐用且好用的充电宝是我们出行必备的利器&#xff0c;它可以为我们的手机、平板等设备提供持续的电力支持。然而&#xff0c;在市面上琳琅满目的充电宝品牌中&#xff0c;究竟哪些才是真正耐用又好用的选择&#xff1f;为了帮助大家更好地了解市场…

BubbleML: A Multiphase Multiphysics Dataset and Benchmarks for Machine Learning

我们使用以下六个分类标准: 研究方法: 这个标准根据如何收集和分析数据来区分研究方法。 实验研究,如参考文献[64]中的研究,涉及在受控环境中研究人员操纵变量并观察结果的物理实验。这种方法对于收集真实世界的数据很有价值,但可能成本高且耗时。模拟研究利用计算模型来模…

Qt5学习笔记(一):Qt Widgets Application项目初探

笔者长期使用MFC开发Windows GUI软件。随着软件向Linux平台迁移的趋势越发明朗&#xff0c;GUI程序的跨平台需求也越来越多。因此笔者计划重新抓一下Qt来实现跨平台GUI程序的实现。 0x01. 看看Qt Widgets Application项目结构 打开Qt5&#xff0c;点击“ New”按钮新建项目。…

2024.05.25 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、夏令营 | 2024年中物院暑期招生夏令营活动报名启动 夏令营 | 2024年中物院暑期招生夏令营活动报名启动 2、实习 | 新华三集团2025届实习体验生招聘全面启动&#xff01; 实习 | 新华三…