Android Service类与生命周期详细介绍
android service类与生命周期
service是android四大组件与activity最相似的组件,都代表可执行的程序,区别在于service一直在后台运行且没有用户界面。
1.service的类图和生命周期
先来看看service的类图:
接下来看看service的生命周期:
2.开发service
(1)开发service需要两步:
第1步:定义子类,继承service
第2步:在androidmanifest.xml文件中配置service
(2)创建service
public class myservice extends service { // 必须实现,绑定该service时被回调 @override public ibinder onbind(intent intent) { return null; } // service被创建时回调 @override public void oncreate() { super.oncreate(); // 定义相关业务逻辑 system.out.println("service is created"); } // service被启动时回调 @override public int onstartcommand(intent intent, int flags, int startid) { // 定义相关业务逻辑 system.out.println("service is started"); return start_sticky; } // service被关闭之前回调 @override public void ondestroy() { super.ondestroy(); system.out.println("service is destroyed"); } }
(3)配置service
<application ... <!-- 配置一个service组件 --> <service android:name=".myservice"> <intent-filter> <!-- 为该service组件的intent-filter配置action --> <action android:name="com.gc.service.my_service" /> </intent-filter> </service> </application>
接下来就可以运行service了。
(4)启动和停止service(一般方式)
// 创建启动service的intent final intent intent = new intent(); // 为intent设置action属性 intent.setaction("com.gc.service.my_service"); ... // 启动指定serivce startservice(intent); ... // 停止指定serivce stopservice(intent);
当程序使用startservice()、stopservice()启动、关闭service时,service与访问者之间无法进行通信、数据交换,故下面介绍另一种方式启动和停止service。
(5)启动和停止service(绑定service并与之通信)
如果service和访问者之间需要进行方法调用或数据交换,则应该使用bindservice()和unbindservice()方法启动、停止service。
bindservice(intent intent, serviceconnection conn, int flags),三个参数如下: intent:指定要启动的service conn:用于监听访问者与service之间的连接情况,当访问者与service之间连接成功时将回调该serviceconnection对象的onserviceconnected(componentname name, ibinder service)方法;反之回调该serviceconnection对象的onservicedisconnected(componentname name)方法(主动调用unbindservice方法断开连接时则不回调) flags:指定绑定时是否创建service,0:不自动创建;bind_auto_create:自动创建 注意:serviceconnection对象的onserviceconnected方法中有一个ibinder对象,该对象即可实现与绑定service之间的通信。 在绑定本地service的情况下,onbind(intent intent)方法所返回的ibinder对象将会传给serviceconnection对象里onserviceconnected(componentname name, ibinder service)方法的service参数,这样访问者就可以通过该ibinder对象与service进行通信。
实际开发通常会采用继承binder(ibinder的实现类)的方式实现自己的ibinder对象。
public class myservice extends service { private int count; // 定义onbinder方法所返回的对象 private mybinder binder = new mybinder(); // 通过继承binder来实现ibinder类 public class mybinder extends binder { public int getcount() { return count; // 获取service的运行状态 } } // 必须实现,绑定该service时被回调 @override public ibinder onbind(intent intent) { system.out.println("service is binded"); return binder; // 返回ibinder对象 } // service被创建时回调 @override public void oncreate() { super.oncreate(); system.out.println("service is created"); count = 100; } // service被断开连接时回调 @override public boolean onunbind(intent intent) { system.out.println("service is unbinded"); return true; } // service被关闭之前回调 @override public void ondestroy() { super.ondestroy(); system.out.println("service is destroyed"); } }
接下来定义一个activity来绑定该service,并在该activity中通过mybinder对象访问service的内部状态。
在该activity绑定该service后,该activity还可以通过mybinder对象来获取service的运行状态。对于service的onbind(intent intent)方法返回的ibinder对象来说,service允许客户端通过该ibinder对象来访问service内部的数据,这样即可实现客户端与service之间的通信。
public class myservicetest extends activity { // service的ibinder对象 myservice.mybinder binder; // 定义一个serviceconnection对象 private serviceconnection conn = new serviceconnection() { // 当该activity与service连接成功时回调 @override public void onserviceconnected(componentname name, ibinder service) { // 获取service的onbind方法所返回的mybinder对象 binder = (myservice.mybinder) service; } // 当该activity与service断开连接时回调 @override public void onservicedisconnected(componentname name) { } }; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); ... // 创建启动service的intent final intent intent = new intent(); // 为intent设置action属性 intent.setaction("com.gc.service.my_service"); // 绑定指定serivce bindservice(intent, conn, service.bind_auto_create); ... binder.getcount(); // 获取serivce的count值 ... // 解除绑定serivce unbindservice(conn); } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!