Android Service总结

  • Post author:
  • Post category:其他


一、什么是Service?

  • 官方api介绍:

Most confusion about the Service class actually revolves around what

it is not:


A Service is not a separate process. The Service object itself does



not imply it is running in its own process;

unless otherwise

specified, it runs in the same process as the application it is part

of.

A Service is not a thread. It is not a means itself to do work off



of the main thread (to avoid Application Not Responding errors).Thus


a Service itself is actually very simple, providing two main features:

A facility for the application to tell the system about something it

wants to be doing in the background (even when the user is not

directly interacting with the application). This corresponds to calls

to Context.startService(), which ask the system to schedule work for

the service, to be run until the service or someone else explicitly

stop it. A facility for an application to expose some of its

functionality to other applications. This corresponds to calls to

Context.bindService(), which allows a long-standing connection to be

made to the service in order to interact with it.

  • service是可以长期在后台运行的服务组件。service没有运行在单独的线程中,而是运行在UI主线程中的。也就是说,如果用户主动结束应用的进程,相关服务也会被结束掉。

二、Service启动方式


(1)context.startService():

假如在activity中启动服务,service运行不受activity生命周期的影响。


(2)绑定方式启动(bindService):

假如在activity中以绑定方式bindService()启动service,如果activity销毁了,所绑定的service也随之销毁;如果activity调用unbindService()方法,解除与service的绑定关系,那么该service也会销毁。

注意:在android 5.0以后,service的intent一定要显性声明,否则会报错(IllegalArgumentException: Service Intent must be explicit)。

解决方法:在创建Service的启动Intent的时候,需要同时设置action和package,就可启动service。

示例代码如下:

Intent intent = new Intent();  
intent.setAction("com.test.action.MyService");  
intent.setPackage("com.test");  
bindService(intent,conn,Service.BIND_AUTO_CREATE);  
  • service启动流程图(图片来自网络):

    service启动流程图

三、Service和Thread的区别

(1)

如果你仅仅需要执行后台任务,并不需要和用户交互,此时你可以使用service。此时依然需要把耗时操作放在工作线程Thread中去执行。

(2)

如果你需要在主线程在执行任务,并且当需要和用户交互的时候,此时你可以选择新建一个thread而非service。

(3)

在某一个activity中去创建Thread,其他activity很难去控制该线程,无法去对thread进行操作。而Service可以和多个activity进行关联。


参考官方指导api:


Service


GitHub :

Android知识点总结



版权声明:本文为dhl91604原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。