文章目录
Android
安卓开发者指南:https://developer.android.google.cn/guide
Android常用四大组件:
1.Activity
2.Service
3.Content provider
4.Broadcast receiver
Android四大组件——Service
- service用于在后台完成用户指定的操作。
- startService() 与 bindService()区别:
(a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
(b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。unbindService - 开发人员需要在应用程序配置文件中声明全部的service,使用< service>< /service>标签。
- 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()
![](https://i-blog.csdnimg.cn/blog_migrate/52e23971a8038f569546f9ea59682c44.png)
启动服务注意:
- onStartCommand可以被多次调用,OnDestroy与onCreate相互匹配,当用户强制kill进程时,onDestroy是不会执行的。
- 对于同类型的service实例一次永远只存在一个,而不管client是否是相同的组件,也不管client是否处于相同的进程中。
- Client A通过startSerice()启动Service 后,可以在其他Client(如Client B、Client C )通过调用stopServic()结束此Service。
- startService(Intent serviceIntent),其中的intent既可以是显式Intent,也可以是隐式Intent,当Client与Service同处于一个App时,一般推荐使用显示Intent。当处于不同App时,只能使用隐式Intent。
- 当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()