Android四大组件之一 Service详解

一、什么是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对象。

猜你喜欢

转载自blog.csdn.net/qq_37982823/article/details/86220997