一、什么是Service?
Service是一个应用组件, 它用来在后台完成一个时间跨度比较大的工作且没有关联任何界面。
二、Service的作用?
访问网络 播放音乐 文件IO操作 大数据量的数据库操作
三、Service的特点
Service在后台运行,不用与用户进行交互
即使程序被切换到后台,或者用户打开新的应用,服务仍可运行
服务并非运行在独立的进程中,而是依赖于创建服务的应用程序进程。如果某个应用进程被杀掉,该服务也会停止
在默认情况下,Service运行在应用程序进程的主线程(UI线程)中,如果需要在Service中处理一些网络连接等耗时的操作,那么应该将这些任务放在Service的分线程中处理,避免阻塞用户界面。
四、Service的两种启动方式
方式一:start的方式:startService(intent) / stopService(intent)
特点: 1.启动的service不会随着activity的销毁而被删除。
2.service是依赖于当前应用的进程存在的。在当前进程中是单例的
3.启动service的activity再被销毁以后,如果重新进入当前应用,意味着创建了新的activity。此时新的activity仍然可以操作之前未被销毁的service。
>结论:service与启动service的activity没关联关系。
方式二:bind的方式:bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE)
unbindService(serviceConnection)
特点: 1.绑定的方式中,Service的启动者(activity)与Service关联关系的。意味着:必须在退出activity之前,需要解绑服务。
2.一旦解绑了服务,就不可以再次解绑
说明:绑定服务可能存在的问题: ①在没解绑的情况下,退出当前activity
②一旦解绑了服务,就不可以再调用解绑的方法。
两种方式的区别:①start的方式与bind的方式,涉及到的生命周期方法不同!
②start的方式和bind的方式,都可以实现activity向service传递数据。但是只bind方式,可以实现service向activity返回数据
③service和service的启动者是否关联关系
如何选择? 我们在需要使用service的时候,需要考虑使用start的方式还是bind的方式?
考虑点: ①在service的启动者退出的时候,service是否需要销毁。
②是否需要service给service的启动者返回数据。
五、Service的生命周期
启动方法不同,Service生命周期也不同
Start方式的生命周期
第一次执行startService(): 构造器--onCreate()--onStartCommond()
第n次执行startService():(n > 1): onStartCommond()
第一次执行stopService(): onDestroy()
第n次执行stopService()(n > 1):没有任何方法的回调
Bind方式的生命周期
第一次执行bindService():构造器-onCreate()--onBind()--ServiceConnection中的onServiceConnected()
第n次执行bindService():(n > 1):ServiceConnection中的onServiceConnected()
第一次执行unbindService():onUnbind()--onDestroy()
第n次执行unbindService()(n > 1):报异常
六、Service的分类?
①Local Service(本地服务)Service对象与Service启动者在同个进程中运行,两者的通信是进程内通信。
②Remote Service(远程服务)Service对象与Service的启动者不在同一个进程中运行,这时存在一个进程间通信问题,Android专门为此设计了AIDL来实现进程间通信。
AIDL:Android Interface Definition Language 用于生成可以在Android设备上两个进程之间进行进程间通信的代码。如果在一个进程中(如Acivity)要调用另一个进程中(如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
AIDL的应用场景:每个应用程序都运行在自己独立的进程中,并且可以启动另一个应用进程的服务,而且经常需要在不同的进程间传递数据对象。在Android平台,一个进程不能直接访问另一个进程的内存空间,所以想要对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过访问进程边界。
七、Service与Activity的区别?
Activity:
①Activity对应一个界面
②应用退出,Activity就会死亡
③应用在次进入,启动的Activity对象是重新创建的
Service:
①不与任何界面关联
②应用退出,Service仍在运行
③应用在次进入,启动的Service还是之前的运行的Service对象
八、Service与Thread的区别?
Service:用来在后台完成一个时间跨度比较大的工作的应用组件。
Service的生命周期方法运行在主线程,如果Service想做持续较长的工作,需要启动一个分线程(Thread)
应用退出:Service不会停止。
应用再次进入:可以与正在运行的Service进行通信。
Thread:用来开启一个分线程的类,做一个长时间的工作。
Thread对象的run()在分线程执行。
应用退出:Thread不会停止。
应用在次进入:不能再控制前面启动的Thread对象。