Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!
既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。
因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 ContextstartService、ContextstopService、ContextbindService,ContextunbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。
我们已经了解了BroadcastReceiver的原理,我们再来看看四大组件之一的Service是怎么启动的,以及怎么运行的原理。
如果遇到什么问题可以来到 >
Context 上下文的意思, java中没有这个参数, 当然也有可能是自己写的类
具体要看看这个参数是哪个类, 如果是sevlet中, 这个context表示sevlet本身吧, 如果是android 中 通常表示 activity或者service 等组件
service内定义枚举其他service怎么调用
可以通过在其他service中实例化该枚举,然后调用相应的枚举方法。代码如下:
```java
// 在其他service中实例化该枚举
MyEnum myEnum = MyEnumvalueOf("VALUE1"); //根据字符串来得到对应的值
// 调用相应的枚举方法
myEnumgetValue(); //获取对应值
myEnumgetDescription(); //获取对应文本信息
```
生命周期如下:
两种启动方式
第一种方式: startService()
通过startService启动后,service会一直无限期运行下去,只有外部调用了stopService()或stopSelf()方法时,该Service才会停止运行并销毁。
当第一次调用的时候,方法顺序是:
构造方法——oncreate()——onStartCommand()
当第二次被调用的时候,直接调用onStartCommand()
结束:stopService():——>onDestory()
第二种方式:bindService()
bindService启动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。service只有一个,但绑定到service上面的client可以有一个或很多个。这里所提到的client指的是组件,比如某个Activity。
client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,这在通过startService方法启动中是无法实现的。
bindService启动服务的生命周期与其绑定的client息息相关。client也可以明确调用Context的unbindService()方法与Service解除绑定。当所有的client与service解除绑定的时候,才会调用onUnbind,然后 Service会自行销毁。
第一次调用:
构造方法——oncreate()——onBind()——onServiceConnected()
结束:unbindService():如果当前有Activity与Service相连——>onUnbind()——>onDestory()
Intentservice
IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时 *** 作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。
以上就是关于service在手机程序中起什么作用全部的内容,包括:service在手机程序中起什么作用、Android重学系列 Service 启动和绑定原理、java中如何调用参数是context的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)