首页 > 其他分享 >Android中Service学习记录

Android中Service学习记录

时间:2024-07-27 20:27:05浏览次数:18  
标签:服务 Service 记录 绑定 fun 启动 println Android

目录

一 概述

Service组件一般用来执行长期在后台的任务,如播放音乐、直播、下载文件等。

二 生命周期

官方图,一图解千言
在这里插入图片描述
两种使用Service的方法,执行不同的生命周期。

2.1 启动服务startService()

调用startService方法启动,多次启动onCreate只一次,onStartCommand会多次;
需要手动停止,调用stopService方法或stopItSelf。

2.2 绑定服务bindService()

调用bindService方法绑定,一次unBindService就能结束服务;如果多次调用unBindService,会出错。
当绑定的对象销毁时,自动解绑;绑定的对象也可以调用unBindService来进行主动解绑。

2.3 先启动后绑定

onCreate -> onStartCommand -> onBind -> onUnBind -> onDestroy

2.4 先绑定后启动

onCreate -> onBind -> onStartCommand -> onUnBind -> onDestroy

三 使用

都是Compose写的,很简陋,ui部分就不贴出来了。

3.1 本地服务(启动式)

两个按钮,一个启动服务,一个停止服务。
思路:
1.继承Service重写方法
2.注册Service
3.使用启动和停止方法

部分代码:

class MyService: Service() {
    private val mBinder = MyBinder()
    override fun onCreate() {
        println("MyService onCreate")
        super.onCreate()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        println("MyService onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onBind(p0: Intent?): IBinder? {
        println("MyService onBind")
        return mBinder
    }

    override fun onUnbind(intent: Intent?): Boolean {
        println("MyService onUnbind")
        return super.onUnbind(intent)
    }

    override fun onDestroy() {
        println("MyService onDestroy")
        super.onDestroy()
    }

    class MyBinder: Binder() {
        fun getServiceMethod() {
            println("this is service method")
        }
    }

}
  <service android:name=".MyService">
       </service>

多次点击启动,再多次点击停止后结果如下,没有问题。
在这里插入图片描述

3.2 可通信的服务(绑定式)

思路:
1.同样先继承一个服务,但是多了一个自定义内部类继承binder如MyBinder,并自定义需要的方法,在onBind方法返回的时候return MyBinder的实例
2.注册Service
3.初始化ServiceConnection 实例,并在方法里将service转成MyBinder类型,然后可以执行类的方法。
4.使用绑定和启动方法
部分代码:

val connection: ServiceConnection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            println("onServiceConnected")
            val binder = service as MyService.MyBinder
            binder.getServiceMethod()
        }
        override fun onServiceDisconnected(name: ComponentName?) {
            println("onServiceDisconnected")
        }
    }
 context.bindService(intent,connection,BIND_AUTO_CREATE)
 context.unbindService(connection)

多次点击,和启动式不同,只会执行onBind一次,解绑只能一次,第二次就报错退出。
在这里插入图片描述

3.3 前台服务

不同之处在于通知栏会显示服务;优先级比较高,不会由于系统内存不足而被回收;而后台服务会。

部分代码

val notificationIntent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
	this,
	0,
	notificationIntent,
	PendingIntent.FLAG_IMMUTABLE
	)
val builder = NotificationCompat.Builder(this, "channel_1")
	builder.setContentTitle("我是ServiceDemo的前台服务")
	builder.setContentText("今天2024.07.24提前下班")
	builder.setSmallIcon(R.mipmap.ic_launcher)
	builder.setContentIntent(pendingIntent)
	val notification = builder.build()
	startForeground(1, notification)

注意:
从Android 8.0(API 级别 26)开始,所有通知都必须通过通知渠道发送。通知渠道允许用户为不同类型的通知设置偏好,比如是否显示通知、是否播放声音、是否振动等。

从Android 13(API级别33)开始,对前台服务的管理变得更加严格,以改善用户体验和系统资源的管理。在Android 14(API级别34)中,这一要求被进一步强调。如果你的应用的targetSdkVersion设置为34或更高,那么在调用Service.startForeground()方法之前,你必须在应用的AndroidManifest.xml文件中的元素上明确指定foregroundServiceType属性。
还要配置权限和通知渠道。
bulider的配置也是缺一不可才会显示具体效果

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

 <service android:name=".MyService"
 		android:foregroundServiceType="specialUse">
</service>

效果:
在这里插入图片描述

3.4 IntentService

继承自Service,有一个工作线程来执行耗时任务;异步任务执行是按顺序的。会自动停止,不需要手动。
而传统的Service在主线程,不能执行耗时任务。

被弃用了,懒得学了;需要的时候再看看。
适用场景有离线下载任务等-。

总结

  • Service有两种使用模式
  • Service可以在后台也可以到前台
  • Service在主线程,不能执行耗时操作

参考

https://blog.csdn.net/JMW1407/article/details/122347723

标签:服务,Service,记录,绑定,fun,启动,println,Android
From: https://blog.csdn.net/qq_45077023/article/details/140622447

相关文章

  • 呆呆鸟 ICPC 训练记录
    The1stUniversalCup.Stage20:IndiaThe1stUniversalCup.Stage22:ShaanxiThe2ndUniversalCup.Stage6:WarsawThe2ndUniversalCup.Stage10:HarbinThe2ndUniversalCup.Stage14:SoutheasternEuropeThe2ndUniversalCup.Stage15:MacauThe......
  • 刷题记录
    给你两个正整数序列\(a_1,\ldots,a_n\)和\(b_1,\ldots,b_m\)。求每个\(j=1,\ldots,m\)的最大公约数\(a_1+b_j,\ldots,a_n+b_j\)。输入第一行包含两个整数\(n\)和\(m\)(\(1\leqn,m\leq2\cdot10^5\))。第二行包含\(n\)个整数\(a_1,\ldots,......
  • 搭建极狐GitLab(基于Docker): 步骤整合汇总记录
    执行背景:(1)CentOS7(虚拟机ISO映像文件=CentOS-7-x86_64-DVD-2009.iso);(2)repo(yum)源已切换为国内源;命令汇总:1.安装Docker相关命令:#查看仓库源中可使用版本yumlistdocker-ce--showduplicates|sort-r#安装指定版本yuminstalldocker-ce-docker完整......
  • Linux捣鼓记录:debian12日志警告:firmware: failed to load iwl-debug-yoyo.bin (-2)
    问题现象:网卡为intelax200,系统为debian12蓝牙wifi使用功能一切正常,根据wiki检查了驱动也都已经安装,但每次开机后,查看cockpit日志会看到警告:firmware:failedtoloadiwl-debug-yoyo.bin(-2)......问题分析:检索网络得到初步结论:iwl-debug-yoyo.bin是一个intel网卡相关的de......
  • linux学习记录(docker)
    DockeDocker是基于Go语言实现的开源容器项目。它诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到业界广泛的关注与参与,目前已有80多个开源组件,逐渐形成了围绕Docker容器的完整的生态体系。dotCloud公司于2013年年底改名为DockerIoc,专注于Docker相关技术和产......
  • 菜鸟通关sqli-labs记录(1-54)
    目录基础环境所需知识Mysql系统数据库union联合查询通关过程通用思路1.第一关2.第二关2.1判断有无注入点2.2猜解列名数量(字段数量)2.3报错,判断回显点2.4信息收集2.5使用对应的SQL注入3.第三关4.第四关5.第五关6.第六关7.第七关8.第八关9.第九关10.第十关11.第十一关12.......
  • Android低功耗子系统的投票机制以及触发进入系统休眠的过程
    从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了wakeupsource以及autosleep机制关于wakeupsource的介绍,请参考:WakeupSource框架设计与实现关于autosleep机制,请参考:autosleep框架设计与实现在内核中,使用wakeupsource提供投票机制,让各个系统模块投票......
  • 记录--终于搞懂了!原来vue3中template使用ref无需.value是因为这个
    ......
  • ssm+vueAndroid共享停车位【开题+程序+论文】-计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,私家车数量急剧增加,停车难问题日益凸显,尤其是在繁华商业区、医院、学校等热点区域,停车位供需矛盾尤为突出。传统的停车管理模式......
  • Linux捣鼓记录:debian配置语言环境
    1.安装区域设置sudoaptupdatesudoaptinstalllocales2.配置语言环境sudodpkg-reconfigurelocales按空格多选,选中en_US.UTF-8和zh_CN.UTF-8这里多选择了英文,可以避免有些软件比如steamcmd报警告:WARNING:setlocale('en_US.UTF-8')failed,usinglocale:'C'.......