博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Service
阅读量:4082 次
发布时间:2019-05-25

本文共 2660 字,大约阅读时间需要 8 分钟。

service既不是一个单独的进程,又不是一个单独的线程;

听歌的服务多用service实现(和activity相比的优势),可以长时间的保存在后台,系统不到万不得已不会杀掉,同时service也不需要界面。

只要service不死,MediaPlayer就一直持有

service的生命周期

启动和停止Service的两种方式

1.Started:context.startService();context.stopService(). 该方法适用于服务和activity之间没有调用交互的情况
2.Bound:context.bindService();context.unbindService() 该方式可以传递参数或者方法调用,通过ServiceConnection的内部类实现来连接Service和Activity。

这里写图片描述

必须要在Manifest中声明service:如果没声明,编译器不会报错(activity会报错)

//.表示根目录,也可以写全为:com.example.jinhua.MusicService

音乐资源文件放在res/raw,

//在oncreare()方法里创建MediaPlayer对象mediaPlayer = MediaPlayer.create(this,R.raw.libai);

第二种方式: Bind Service 继承自Binder类

首先bindService()方法,把serviceConnection作为参数给传进去,实际上serviceConnection是传给Service,Service会把onBind的Ibinder传回给刚刚传进来的serviceConnection(一个service要想能够被其他组件绑定,那么它的 onBind() 方法必须被实现,且必须返回一个 IBinder 对象,然后其他组件可以通过这个 IBinder 对象与该 service 进行通讯。),在serviceConnection里我们就会收到service其实是Binder,我们又在Binder中构造了service,即return service,所以通过这种方法可以获取service,service里面又可以创建公共方法,可以通过service对象的这些方法获取里面数据,这是就可以互相通信。

IBinder是负责service和外界(如activity)的通信

将IBinder强转为我们本身的Binder;

bindService注意:

1、bindService(或者startService)后,service的onCreate方法只执行一次,执行后service就运行起来了,如果不unbindService的话,service就不会被关闭onDestroy的,即使stopService(或者unbindService)也没有用。

2、

startService()
bindService()

(1)先执行startService的onCreate方法,然后在bindService;为什么要用bindService,是为了让service和一个应用界面、组件进行绑定,一旦绑定了,service和这个应用界面就会同生死共存亡,当界面被销毁掉时,绑定的service就会调用unbindService,然后stopService,然后onDestroy然后被销毁。

(2)如果界面没有被销毁,而又绑定了界面,这时调用stopService,是不会销毁service的。
这就是bind和startService、stopService的区别。
(3)如果没有bind,用的是startService、stopService,若界面销毁了,service还会在后台进行。

IntentService

异步处理服务

IBinder是负责service和外界(如activity)的通信

将IBinder强转为我们本身的Binder;

bindService注意:

1、bindService(或者startService)后,service的onCreate方法只执行一次,执行后service就运行起来了,如果不unbindService的话,service就不会被关闭onDestroy的,即使stopService(或者unbindService)也没有用。

2、

startService()
bindService()

(1)先执行startService的onCreate方法,然后在bindService;为什么要用bindService,是为了让service和一个应用界面、组件进行绑定,一旦绑定了,service和这个应用界面就会同生死共存亡,当界面被销毁掉时,绑定的service就会调用unbindService,然后stopService,然后onDestroy然后被销毁。

(2)如果界面没有被销毁,而又绑定了界面,这时调用stopService,是不会销毁service的。
这就是bind和startService、stopService的区别。
(3)如果没有bind,用的是startService、stopService,若界面销毁了,service还会在后台进行。

IntentService 异步处理服务

异步处理服务:各自干各自的事,A做好了通知一下B就好。
同步处理服务的意思:A执行完了把结果给B,B再执行。
(1)onStartCommand()//开始的时候把intent给你
(2)onHandleIntent()//处理intent数据,这里的intent是由startService或者bindService传的
(3)在什么场景下使用:
什么时候用Service,什么时候用IntentService?当有需要把任务用队列来分配时用IntentService,当不需要时,比如后台播放,就用Service。

总结:

(1)Service的基本概念
(2)如何使用
1、Start
2、Bind
(3)IntentService
(4)Service的生命周期
(5)Bound Service的生命周期

小技巧:

1、Service是一个进程或者线程吗?都不是。
2、能做耗时操作吗?不能,需要new一个Thread来做耗时操作。
3、用它主要来做什么?主要用来在后台长久的运行。

你可能感兴趣的文章
C++类、结构体、函数、变量等命名规则详解
查看>>
C++ goto语句详解
查看>>
【数据结构周周练】008 二叉树的链式创建及测试
查看>>
《软件体系结构》 第九章 软件体系结构评估
查看>>
《软件体系结构》 第十章 软件产品线体系结构
查看>>
《软件过程管理》 第六章 软件过程的项目管理
查看>>
《软件过程管理》 第九章 软件过程的评估和改进
查看>>
分治法 动态规划法 贪心法 回溯法 小结
查看>>
《软件体系结构》 练习题
查看>>
《数据库系统概论》 第一章 绪论
查看>>
《数据库系统概论》 第二章 关系数据库
查看>>
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>