内容概述:
1,Service的应用场景,以及和Thread的区别
2,开启Service的两种方式以及区别(startService() 和BindService())
一,Service基础
1,服务的定义:耗时逻辑,长时间运行的任务,可在后台开启
Service(服务)是一个一种可以可以在后台执行长时间运行操作而没有用户界面的应用组件
2,Service与Thread的区别
Thread:异步操作,可作为独立的子线程,可做耗时操作;
本地Service:依附于主线程,不能做耗时操作
两者没有关系。
理解:
安卓后台,运行完全不依赖UI线程,即使Activity被销毁,程序被关闭了,服务进程依然存在。
若服务要做耗时操作,则要创建子线程,然后再去做耗时操作。
为何不在activity中做,因为activity很难对子线程Thread进行控制。特别是在Activity被销毁之后,很难获取之前创建的子线程。
而Service处理后台任务,Activity可以很方便的对Service进行创建和销毁。完全不用担心对后台任务无法进行控制的情况,
源于https://blog.csdn.net/xiaoxiaohu_/article/details/70257262
问题:在开发中遇到关闭一个页面(Activity),里面的线程是否随着关闭?
回答:不会(经过测试),当在开发中遇到需要在activity关闭的时候关闭线程时
二,Service的两种启动方式
1.startService()
(后台无限期运行,除非手动关闭Service);
相关的方法有:
onBind()(该方法在实现startService()方法时,返回空值)
onCreate()首次创建
onStartcommand()每次通过startService()方法启动时都会调用
关闭服务时,可以调用stopService(),stopSelf()方法
onDestory()服务销毁,资源销毁,销毁注册时的一些监听和线程
在这里加一句关于stopService()和stopSelf()方法的区分:
1,stopSelf():方法执行之后,服务会继续执行,不会马上停止,当完成所有的功能后,才会停止服务,接着调用onDestory();
2,stopService(): 调用该方法后,立刻停止服务,调用服务的onDestory()
startService的使用:
1,定义一个类集成Service
2,在manifest中配置Service
3,使用Context的startService(Intent)的方法来启动该Service (开)
4,不再使用时调用stopService(Intent)方法停止该服务 (关)
2.bindService()
(允许Activity与Service有数据交互,可以多个activity绑定一个service,可以在不同的进程间进行通信。)
与上个方法的区别是
绑定取消后 => 自己会自动销毁
bindService()的使用:
1,创建BindService的服务端,继承Service并在类中,创建一个实现IBinder接口的实例对象并提供公共方法给客户端;
2,从onBind()回调方法中返回此Binder实例
3,在客户端中,从onServiceConnected()回调方法接收Binder,并使用提供的方法调用绑定服务。
客户端:Activity
服务端:Sevice
简化使用步骤如下:
1,创类:有接口(入口)
有方法
2,在onBind()中返回Binder实例
3,在onServiceConnected()中接收Binder,并用提供的方法调用绑定的服务
实际的使用步骤如下:
客户端为ServiceActivity
在该客户端中,可以有ServiceConnection方法,中可包含onServiceConnected,onServiceDisConnected这两种方法,可以在绑定服务的同时回调,拿到service传过来的iBinder,从而实现交互。
onServiceDisconnected()方法可以在取消绑定的同时回调,但正常情况下是不被调用的,它的调用时机是当与Service服务被意外销毁时。例如内存资源不够时这个方法才会被自动调用。
点击开启服务时,bindService(intent,conn,Service.BIND_AUTO_CREATE);
接触绑定:unbindService(conn);
获取数据:即已在BindService中定义了getCount(),
此时mService调用getCount()这个公共方法
PS:Android5.0之后不能隐式启动Service