Android——四大组件Service

Android

安卓开发者指南:https://developer.android.google.cn/guide
Android常用四大组件:
1.Activity
2.Service
3.Content provider
4.Broadcast receiver

Android四大组件——Service

  1. service用于在后台完成用户指定的操作。
  2. startService() 与 bindService()区别:
    (a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
    (b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。unbindService
  3. 开发人员需要在应用程序配置文件中声明全部的service,使用< service>< /service>标签。
  4. Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
    来源:https://blog.csdn.net/ican87/article/details/21874321
    这部分有个大概了解,之后再补充…

1 简介

Service是Android中的一个类,用于后台处理耗时操作(注意另需子线程)。不受Activity生命周期影响(可以理解成没有界面的Activity)。Service并不与用户产生UI交互。其他的应用组件可以启动Service,即便用户切换了应用,启动的Service仍可在后台运行。一个组件可以与Service绑定并交互,甚至跨进程通信。

使用场景:网络请求、播放音乐、执行文件读写操作、content provider交互。
绑定服务:最大的作用是来实现对service执行的任务进行进度监控。

2 生命周期

onCreate()、onStartCommand()、onBind()、onUnbind()、onDestroy()

启动服务注意:

  1. onStartCommand可以被多次调用,OnDestroy与onCreate相互匹配,当用户强制kill进程时,onDestroy是不会执行的。
  2. 对于同类型的service实例一次永远只存在一个,而不管client是否是相同的组件,也不管client是否处于相同的进程中。
  3. Client A通过startSerice()启动Service 后,可以在其他Client(如Client B、Client C )通过调用stopServic()结束此Service。
  4. startService(Intent serviceIntent),其中的intent既可以是显式Intent,也可以是隐式Intent,当Client与Service同处于一个App时,一般推荐使用显示Intent。当处于不同App时,只能使用隐式Intent。
  5. 当Service需要运行在单独的进程中,AndroidManifest.xml声明时需要通过android:process指明此进程名称,当此Service需要对其他App开放时,android:exported属性值需要设置为true(当然在有intent-filter 时默认值就是true)。

绑定服务注意:
bound service生命周期依附于client生命周期,当client不存在时服务将执行onDestroy,同时通过service中的binder对象较方便的进行client-service通信。

3 Service分类

service分为两种启动服务和绑定服务。

3.1 started(启动服务)

当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态,一直运行在后台,即便组件被destroy。(比如一个start的service执行在后台下载或上传一个文件,完成之后service自行停止)

使用
1.创建MyService类,继承Service类,在AndroidMnifest.xml中注册服务。
2.创建service对象:MyService receiver = new MyService();
3.配置文件中注册:< service android:name=“包名.类名”>< /service>
4.启动服务:Intent intent=new Intent(MainActivity.this, MyService.class);
startService(intent)

3.2 bound(绑定服务)

当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。通过这种方式启动的service是一个client-server结构,可以与帮顶他的组件交互。一个bound service仅在有组件与其绑定时才会运行,多个组件可与一个service绑定,如果该服务不再与任何组件绑定时,会被destroy。

绑定服务:
a)自定义 Service继承基类Service,并重写onBind(Intent intent)方法,此方法中需要返回具体的Binder对象;
b) Client 通过实现ServiceConnection接口来自定义ServiceConnection,并通过bindService(Intent service, ServiceConnection sc, int flags)方法将Service绑定到此Client上;
c)自定义的ServiceConnection中实现onServiceConnected(ComponentName name, IBinder binder)方法,获取service端binder实例。
d)通过获取的 Binder实例进行Service端其他公共方法的调用,以完成Client-Service通信;
e) 当Client在恰当的生命周期(如onDestroy等)时,此时需要解绑之前已经绑定的Service,通过调用函数unbindService(ServiceConnection sc)。

如果服务不存在:onCreate ->onBind ->onUnbind ->onDestroy(此时服务没有在后台运行,并且会随着Activity的摧毁而解绑并销毁)
服务已存在:那么bindService方法只能使onBind方法被调用,而unbindService方法只能使onUnbind被调用。

IBinder接口

在android中用于远程操作对象的一个基本接口。

ServiceConnection接口

一个接口,主要在绑定服务中用于客户端和服务端连接的。当客户端正常连接着服务时,执行服务的绑定操作会被调用。

onServiceConnected():每次绑定服务时都被调用,进行进度的获取及操作。
onServiceDisconnected()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值