Kotlin实现Service的简单使用
创始人
2025-06-01 03:26:47

Service的使用

      • 1异步通信方式
      • 2Service的启动和停止
      • 3希望Activity和Service进行通信,让Activity知道Service在干什么事情或者进度如何。需要使用Service中的onBind()方法。
      • 4实现前台的Service
      • 5在Service中执行任务时更加规范的操作

1异步通信方式

Android在运行过程中所有程序都是主线程中执行的,因此当使用thread代码块实现一些组件的更新时,需要用到异步通信Handler。

override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.service_test_main)//实现异步通信的方式进行更新数据val handler=object : Handler(Looper.getMainLooper()){override fun handleMessage(msg: Message) {when(msg.what){1->textView.text="师者所以传道授业解惑也"}}}//如果想在子线程里面进行组件的更新,需要使用到异步机制change_textView.setOnClickListener(){thread {val msg=Message()//更新文字msg.what=1handler.sendMessage(msg)}}}

使用步骤:1创建handler对象,在里面重写handlerMessage方法用来处理消息到达之后的逻辑。2建立消息Message对象,并且绑定发送消息的类别,让其能够区别不同逻辑的处理方式。3handler来发送消息

2Service的启动和停止

1在MyService中继承Service,实现其中的方法即可获得自定义的Service,主要有如onBinder的以下几个方法

//此方法用来和Activity进行通信使用override fun onBind(intent: Intent): IBinder {return mBinder}//只有第一次调用的时候才会执行override fun onCreate() {super.onCreate()}//每次启动时都会调用override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {return super.onStartCommand(intent, flags, startId)}override fun onDestroy() {super.onDestroy()}

在Activity中启动时和Activity的启动方式类似

start_service.setOnClickListener(){val intent= Intent(this,MyService::class.java)startService(intent)}end_service.setOnClickListener(){val intent=Intent(this,MyService::class.java)stopService(intent)}

3希望Activity和Service进行通信,让Activity知道Service在干什么事情或者进度如何。需要使用Service中的onBind()方法。

1在service中继承Binder()类,在此类中进行逻辑的编写,将结果通过onBind()方法返回


class MyService : Service() {//为了实现和Activity的通信,模拟开启服务来进行下载功能private val mBinder=DownloadBinder()class DownloadBinder: Binder(){fun startDownload(){Log.d("MyService","开始下载")}fun getProgress():Int{Log.d("MyService","当前下载的进度")return 20}}//此方法用来和Activity进行通信使用override fun onBind(intent: Intent): IBinder {return mBinder}//只有第一次调用的时候才会执行override fun onCreate() {super.onCreate()}//每次启动时都会调用override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {return super.onStartCommand(intent, flags, startId)}override fun onDestroy() {super.onDestroy()}}

2在Activity中需要先对Activity和Service进行绑定,先实现ServiceConnection接口中的方法然后在方法里进行绑定之后的逻辑操作和解绑之后的逻辑操作。

class ServiceTest:AppCompatActivity() {lateinit var downBinder:MyService.DownloadBinderprivate val connnection=object :ServiceConnection{//该方法会在Activity与Service绑定之后进行调用override fun onServiceConnected(name: ComponentName?, service: IBinder?) {downBinder=service as MyService.DownloadBinderdownBinder.startDownload()downBinder.getProgress()}override fun onServiceDisconnected(name: ComponentName?) {Log.d("serviceTest","Service和Activity解绑成功")}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.service_test_main)//实现异步通信的方式进行更新数据val handler=object : Handler(Looper.getMainLooper()){override fun handleMessage(msg: Message) {when(msg.what){1->textView.text="师者所以传道授业解惑也"}}}//如果想在子线程里面进行组件的更新,需要使用到异步机制change_textView.setOnClickListener(){thread {val msg=Message()//更新文字msg.what=1handler.sendMessage(msg)}}//service的启动和停止start_service.setOnClickListener(){val intent= Intent(this,MyService::class.java)startService(intent)}end_service.setOnClickListener(){val intent=Intent(this,MyService::class.java)stopService(intent)}//数据和Service进行通信,获取到service的正在做的事情,需要对Service进行绑定bind_service.setOnClickListener(){val intent=Intent(this,MyService::class.java)bindService(intent,connnection, Context.BIND_AUTO_CREATE)//绑定service}unBind_service.setOnClickListener(){unbindService(connnection)}}

4实现前台的Service

在主Activity中点击按钮就启动当前的Service在前台通知上


class ForegroundServiceTest : Service() {@RequiresApi(Build.VERSION_CODES.O)override fun onCreate() {super.onCreate()val manager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagerval channel=NotificationChannel("myService","前台Service通知",NotificationManager.IMPORTANCE_DEFAULT)manager.createNotificationChannel(channel)val intent=Intent(this,ServiceTest::class.java)val pi=PendingIntent.getActivity(this,0,intent,0)val notification=NotificationCompat.Builder(this,"myService").setContentTitle("前台Service主题").setContentText("前台的Service的内容").setSmallIcon(R.drawable.ic_baseline_arrow_back_ios_24).setLargeIcon(BitmapFactory.decodeResource(resources,R.drawable.ic_baseline_menu_24)).setContentIntent(pi).build()startForeground(1,notification)}override fun onBind(intent: Intent): IBinder {TODO("Return the communication channel to the service.")}
}

5在Service中执行任务时更加规范的操作

一般在Service中可能需要进行比较耗时的操作,而主线程又需要获得结果,但是当长时间没有获得结果之后就会出现ANR(Application Not Responding)的情况,因此为了解决这种情况更标准的写法是在Service中创建新的线程来处理任务进行异步的工作。

 //每次启动时都会调用override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {thread{
//在里面进行逻辑的处理工作,最后别忘了进行关闭stopSelf()
}return super.onStartCommand(intent, flags, startId)}override fun onDestroy() {super.onDestroy()}

相关内容

热门资讯

今日起招股发售价9.75港元,... 6月2日,车来了母公司元光科技启动全球发售,发售价9.75港元,预计将在6月10日在港交所挂牌。元光...
港股午评:恒生指数跌2.20%... 新京报贝壳财经讯 6月2日,港股午间收盘,恒生指数跌2.20%,恒生科技指数跌2.43%。石药集团跌...
夏乐:美债压力与美元走弱 全球... 原创 财联社 蜂网专家2025年05月29日《首席说》是财联社倾力打造的一档高端直播联线栏目。面向泛...
罗志恒:财政政策不应受3%赤字... 罗志恒系粤开证券首席经济学家、中国首席经济学家论坛理事自2008年以来,本轮积极财政政策实行了长达1...
三大利空,突袭! 三大利空,突... 时局依然不稳!今天早上,全球市场全线杀跌。日经指数一度杀跌近1.5%,中国台湾股指大跌近1%,港股三...
美国客户“疯狂”催单 这家川企... 自硬公司的精密零件产品之一:随钻用核心零部件。韩吉尔摄 “5月中旬,美国休斯敦的客户发邮件,要求尽快...
这只港股,突然暴涨超60%!发... 6月2日,亚太股市开盘后持续走弱。不过,港股方面,加密货币数字概念股大涨,连连数字涨62.67%。港...
招商基金三首席同日上任!“去管... 当同行纷纷为投研人才做“去管理化”减法时,招商基金却反其道而行之,提拔朱红裕、王景两位基金经理。这究...
2025浙江国际电子商务博览会... 这个周末,端午的粽叶飘香和六一小朋友的欢笑声撞了个满怀~跨境电商圈也跟着热闹到飞起。 从节令美食到文...
头部餐饮,火拼儿童餐 头部餐饮... 总第4234期作者 |餐饮老板内参内参君儿童餐,卷入next level端午恰逢六一,双节叠加背景下...
舆论战升级!巨子生物深夜回应,... 2025.06.02本文字数:2490,阅读时长大约4分钟作者 |第一财经 刘晓颖重组胶原蛋白成分之...
财经时评|以创新厚度重塑汽车产... 作者 远山中国汽车工业协会与工业和信息化部近期针对行业“内卷式”竞争的联合发声,为持续蔓延的价格战按...
恒生指数午盘下跌2.20%,恒... 6月2日午盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下跌2.43%,报504...
“以旧换新”带货1万亿,中国何... “美国想让制造业回流成为中国的样子,一个踏实劳作的‘生产者社会’;而中国想努力扩大消费成为美国的样子...
恒指半日跌2.2% 恒指半日跌... 【恒指半日跌2.2%】截至午间收盘,香港恒生指数下跌2.20%,报22778.45点;恒生科技指数下...
“成分之争”舆论战升级,巨子生... 重组胶原蛋白成分之争的舆论战再度升级。美妆博主 "大嘴博士" (郝宇)近日连续发文质疑,巨子生物(0...
汇川技术新注册《InoCube... 证券之星消息,近日汇川技术(300124)新注册了《InoCube-InoData数据分析系统V1....
博将控股多家所投企业荣登202... 博将控股多家所投企业荣登2025杭州独角兽与准独角兽榜单 2025年4月24日,由民建浙江省委会、浙...
刚刚,A50直线跳水!亚太股市... 6月2日,亚太股市开盘后持续走弱。富时中国A50期货开盘跌0.6%,截至目前跌幅1.91%。 截至...
问界、智界、享界、尊界,202... 2025鸿蒙智行:四界表现鸿蒙智行作为国内造车新势力的主流品牌,一共规划了“五界”车型,包括:问界、...
花样年控股:重组支持协议的最后... 6月1日,花样年控股(01777.HK)公告称,公司2024年4月29日所订立的重组支持协议的最终截...
蜜雪集团股价创上市以来新高 蜜... 新京报贝壳财经讯 6月2日,港股蜜雪集团盘中涨超7%,股价刷新上市新高。
美单边关税让全球经济面临更大不... 美国征收关税的对象和标准可能随意变更,其关税政策具有不可预测性。无论是外国企业,还是美国本土企业,都...
桃李面包创始人向其两儿子转让3... 5月30日晚间,桃李面包(沪市代码:603866)公告称,公司控股股东及实际控制人吴志刚通过大宗交易...
前4月东莞重大项目完成投资42... 本期看点:前4月东莞重大项目完成投资429.09亿元;长联科技募投项目提升年产至2.77万吨;广东省...
恒生指数跌幅扩大至2%,医药、... 6月2日,恒生指数跌幅扩大至2%,医药、地产、能源板块跌幅居前,美中嘉和跌超14%,石四药集团跌近1...
港股、A50飘绿,亚太市场多数... 早间,亚太市场多数下跌。港股、A50集体下跌其中,恒生指数、恒生科技指数开盘跌幅扩大, 港股生物技术...
雷军看好的两兄弟,要IPO了 ... 2021年夏,小米产业园办公室内,雷军饶有兴致地打量眼前一对兄弟,“为什么张波是创始人,董事长却是张...
圣阳股份涨1.66%,成交额9... 5月30日,圣阳股份涨1.66%,成交额9.82亿元,换手率15.03%,总市值66.67亿元。 异...