Service 相关的一些总结

一、Service和线程有哪些区别?

  • Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

  • Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。

二、生命周期

一.服务分两种启动和绑定:

1:本地服务
Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。(启动服务:应用组件通过startService(intent)的方式启动)

2:远程服务
Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加 载它。(绑定服务:应用组件通过 bindService(intent, conn, Context.BIND_AUTO_CREATE)绑定服务)

二.启动服务/绑定服务的区别:

1)启动的服务与Activity之间是分离的不能进行通讯,即使启动它的组件被杀死,它仍然可以继续存在;而绑定服务与Activity有关可以进行通讯,与所绑定的组件共存亡。
2)启动的服务可以自杀stopSelf()也可以stopService(),但是绑定的服务只能通过绑定的组件解绑unbindService()。
3)生命周期不同

在这里插入图片描述
1、每次onStart()执行,onStartCommand()也执行

2、在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),
其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

3、回到桌面,服务仍然在后台运行。

4、在启动服务和绑定服务后,只有解绑与终止服务共同调用,才能真正终止服务。

5、多个请求要启动Service时,系统对应地调用onStartCommand(),从而可以并发的执行多个请求。

6、onCreate(): 系统在Service第一次被创建的时候调用该方法,它是再onStartCommand()和onBind()方法之前被调用的。如果这个Service已经在运行了,那么这个函数不会被调用。

7、onStartCommand(): 其他组件调用startService()来启动一个Service时,系统会调用这个回调函数,该函数执行过后,Service就已经被启动了,并且开始在后独立运行。

8、onDestroy():系统在一个Service不再被使用,并且准备摧毁的时候调用该方法,它是Service收到的最后一个被调用的方法。在这里可以进行一些清除工作,例如线程、注册的监听、以及接收器等等。

三、IntentService

IntentService:异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。

IntentService有以下特点:

(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4) 默认实现的onBind()返回null

(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中

四、Service与组件通信

bindService() - unbindService()

1.进行数据传递

Service中声明一个Binder类,类中声明用来传递数据的方法。比如向Activity返回Service实例/接受或返回数据。
Activity实现ServiceConnection接口,Activity绑定Service调用bindService()方法。此时onServiceConnected()方法就会被调用。此方法中利用获取的Binder实例,可以调用Service中各个用来传递数据的方法。
这就实现了Activity向Service传递数据,Service接收数据进行数据操作后,再返回给Activity。

2.Activity监听Service数据变化

Service自定义Callback接口,声明监听数据的抽象函数onDataChange(String data),参数data用来向外部暴露data数据,并设置callback实例的setter方法。再onCreat()方法中,Service利用接收来的data数据,进行耗时操作后(例如开启线程进行data的循环递增),用callback.onDataChange(data + “”)暴露data数据。
Activity在onServiceConnected()方法中,利用获取的Service实例调用setCallback()方法,同时实例化Callback接口,进行接口回调实现onDataChange()函数,此时就监听到了Service中data数据的状态,并利用Handler进行更新UI操作。

3、利用广播方式

startService() - stopService()

Activity:动态注册广播 。将data存储到intent中,调用startService(intent)开启服务。
Service:重写onStartCommand()方法,利用intent.getXXExtra()获取Activity传来的数据。对数据进行操作后,将data存到intent中并发送广播。
Activity:接收广播,重写onReceive()函数,开启主线程并从intent中取出data数据,进行更新UI操作。
利用广播和intent实现了数据通信和监听服务数据状态。

五、AIDL

1. 简述

为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。

要进行跨进程通信的话,其实我们还有其他的一些选择,比如BroadcastReceiver , Messenger 等。但是 BroadcastReceiver 占用的系统资源比较多,如果是频繁的跨进程通信的话显然是不可取的;Messenger进行跨进程通信时请求队列是同步进行的,无法并发执行,在多进程的情况下不适用。这种时候就需要使用AIDL 了。

官方文档特别提醒我们何时使用AIDL是必要的:“只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL…"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring框架中的@Service注解是用来声明一个类为服务层(Service)组件的注解。它的作用是将带有该注解的类标识为Spring容器中的一个Bean,同时也能够让Spring容器对该类进行特定的处理。 @Service注解通常用于注解在业务逻辑层的类上,它表明该类是一个服务层的组件,负责处理业务逻辑。在Spring容器中,通过该注解标注的类会被自动扫描并创建对应的Bean实例,然后可以通过依赖注入(DI)的方式将这些实例注入到其他需要使用这些服务的类中。 @Service注解的使用方便简单,在实际开发中可以很轻松地定义和使用服务层的组件。它可以与其他的注解一起使用,例如@Repository注解用于标注Dao层组件,@Autowired注解用于实现依赖注入等。通过这些注解的组合使用,可以实现各个层次之间的解耦,提高代码的可维护性和可读性。 Spring的@Service注解不仅仅是一个标记注解,它还提供了额外的功能。例如,可以使用@Service注解对服务层的组件进行事务管理,可以在注解中指定事务的传播属性、隔离级别等。此外,还可以通过配置属性对注解进行更精细的控制,例如指定Bean的名称、是否对Bean进行延迟加载等。 总结来说,@Service注解是Spring框架中用来标识服务层组件的注解。通过对该注解的使用,可以使得服务层的组件更加易于定义和维护。同时,该注解还提供了更多的功能,例如事务管理、配置属性等,可以帮助开发人员更好地控制和管理服务层的组件。 ### 回答2: Spring中的Service注解是用来标识一个类为服务层组件的注解。Service层是位于控制层和持久层之间的一层,主要负责业务逻辑的处理和调度。通过@Service注解,我们可以将一个普通的Java类标识为Service层组件,使其成为Spring容器中的一个Bean对象。 @Service注解与@Component注解类似,都是用来标识一个类为Spring容器管理的组件,只不过@Service注解对应的是服务层组件而已。Service层主要用于处理具体的业务逻辑,例如数据的处理、事务的管理等等。通过@Service注解,我们可以将业务逻辑的相关类实例化并注入到需要调用的地方,实现业务的分层和代码的复用。 在使用@Service注解时,我们可以通过其value属性指定该组件的名称,默认情况下使用类名的首字母小写作为Bean对象的名称。如果在注解中指定了名称,那么Spring容器就会根据该名称创建并管理该Bean对象。另外,我们还可以通过@Service注解来控制该组件的生命周期,可以设置成为单例模式或者多例模式。 总结来说,@Service注解是用来标识一个类为Service层组件的,在Spring容器中,通过该注解将Service层的类实例化并进行管理,以达到业务逻辑处理和调度的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值