Android四大组件之一——Service

如何使用?

        继承自Service,重写onCreate(),onStartCommand()和onDestroy()方法,在相关联的Activity中加入与此Service相关的逻辑(构建Intent对象,启动和停止Service等)。

与activity的交互

       自定义Service需自定义一个继承与Binder的内部类MyBinder,并在自定义Service中的onBind()方法返回这个内部类MyBinder的实例。内部类MyBinder需自行定义想要实现的功能,并在与自定义Service相关联的Activity中实现ServiceConnection接口,并在此接口的onServiceConnected()方法中将IBinder的引用向下转型成内部类MyBinder类型,并调用自行实现的功能方法,在onServiceDisconnected()方法中关闭资源等等。

        在activity中调用bindService(Intent service, ServiceConnection conn, int flags)方法将activity与service绑定,参数service 是Intent对象,conn是之前自己创建的ServiceConnection对象,flags是标志位,代表绑定后的操作选项(如关联后自行创建Service——BIND_AUTO_CREATE)。

与Thread关系

        Service与Thread无任何关联,Service运行在主线程之中。可以在Service中创建子线程用于处理耗时的逻辑操作。

前台Service

        在onCreate()中创建notification引用并将其作为参数创建PendingIntent ,调用startForeground()方法让Service成为前台Service。

远程Service

        在Manifest注册Service时指定android:process=":remote"便可将Service转换成远程Service,是运行在另一进程之中,但存在诸多不便。1)不能使用之前的方式将activity与service绑定关联。2)需要使用AIDL才能与这个远程service建立关联,并且在传输数据的时候受到限制,只能传输一些基本的数据(如List、map和基本的数据类型等)和实现了Parcelable接口的类,并且这个类要定义一个同名的AIDL文件。


销毁

        对于正在运行且与activity相关联的service,必须要与activity解除关联并且停止运行,service才会被销毁。

        后台Service运行优先级较低,在内存不足的时候有可能被系统销毁。

注意事项

1.Service不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务

2.通过startService()方法启动的Service和调用者之间不存在关联,即使调用者关闭了,service仍然运行。Context.stopService()停止service,此时系统会调用service的onDestory()。使用此方法启动service时,首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStart()方法。

3.使用bindService()启动的服务与调用者绑定,只要调用者关闭则Service就终止。使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者关闭时系统会调用服务的onUnbind()-->onDestory()。使用Contex.unbindService()主动与调用者解除绑定,此时系统会依次调用onUnbind()-->onDestory()。

4.对于既使用startService()启动又使用了bindService()的Service,必须同时调用stopService()和unbindService()两个方法才可以停止这个Service

你可能感兴趣的:(Android四大组件之一——Service)