Service详解

Service 详解

service说明

service是一个可以在后台长时间执行的应用组件,不会向用户提供界面,其他的应用组件可以启动一个service,即使用户选择了另一个程序,这个service还是会继续运行,另外,一个组件可以和一个service绑定,甚至进行进程间的交流,举个例子:一个servic可以网路处理,播放音乐,执行I/O文件流,

一个service有以下两种重要的启动方式

Started

当一个应用组件启动一个service靠调用StartService()一个Service就被Started了,一旦开始,即使启动这个Service的组件被销毁,但service也可以在后台无限期的运行,通常,一个Started 服务执行一个单个的操作,并且不会返回结果给调用者,举个例子:当通过网络下载或上传一个文件,当这个操作完成之后,这个service也会自我停止

Bound

当一个应用组件调用bindService()时,一个Service就被Bound了,一个bound的Service会提供一个允许组件和service交互的client-service接口,发送数据,得到结果,甚至进行进程间的交流,一个bound的Service只有被其他的应用组件绑定才会运行,多种组件可以同时绑定service,但当没有一个组件绑定时,这个service就会被销毁

尽管这两种启动方式是分开说的,但是他们可以别同时使用,这只看你是否实现了onStartCommend()回调方法允许组件去start这个service,和onBind()方法允许去bound

警告;

一个service运行在宿主进程的主线程,这个Service不会自己创建一个自己的线程,并且不会在不同的进程里运行(除非你特殊指明),这意味着如果你的service将要占用很多的CPU或运行阻塞操作(如:MP3回放歌曲),你应该在Servic创建一个新的线程,靠使用一个分开的线程,你将要减小应用程序ANR(应用程序无响应)的情况,并且你的组件可以继续在主线程里运行

基础:

为了创建一个service,你必须创建一个继承Service(或是他的子类),并且,必须实现一些回调方法去管理处理service的生命周期,如果合适的话,下面这些重要的回调方法你应该实现

onStartCommend()

当其他的组件(例如:activity)要求service被Started时,系统将调用这个方法靠调用startService(),一旦这个方法被执行了,这个service将在后台被无限期的运行,如果你实现了这个方法,你所有义务的停止servic,靠调用stopSelf()或者stopService()(如果你只想提供bound的Service,则不需要实现此方法)

onBind()

当其他的组件想要bound一个Service,系统将调用这个方法,靠bindService(),如果你实现了这个方法,你必须返回一个IBinder来提供一个供客户端和service进行交互的接口,如果你不系那个允许被绑定,你可以一返回null

onCreate()

当service第一次被执行系统将调用这个方法去执行一次性的设置工作,如果这个service已经运行,这个方法将不会被调用

onDestroy()

当这个service不再被使用并且将要被销毁的时候,系统将调用这个方法,你可以声明这个方法去清除线程,注册监听器,接收器等等,这个是service接收的最后一个回调方法

只有系统内存很少和必须归还系统内存时,系统才会强力停止一个Service,如果一个service被Bound到一个用户正在用的activity,那么有很少的几率系统会停止Service,吐过这个service被声明在前台运行,那么它将几乎不会被杀死,如果系统杀死了你的service,只要资源变得再一次可以利用的话,系统h会重新开始这个service

在manifest里声明一个service

和Activity等其他组件一样,你必须在manifest里声明你的所有service,添加方法在<application>属性里添加M<service>属性,举个例子

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>
为了确保你的app是安全的,总是使用一个明确的intent去started或bind你的Service并且不要在声明intent filters在<service>,如果必须要用一些不明确的组件来start一个service,你必须为你的service提供一个intent filter文件并且提供排除组件名称,然后你也必须用setPackage()为intent设置一个包,为目标service提供足够的消除歧义的说明

另外,你可以确保你的service只能有你的app调用,方法就是;添加<android:exported>并设置为“false”


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值