欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Service类与生命周期详细介绍

程序员文章站 2023-12-14 11:14:04
android  service类与生命周期 service是android四大组件与activity最相似的组件,都代表可执行的程序,区别在于service一...

android  service类与生命周期

service是android四大组件与activity最相似的组件,都代表可执行的程序,区别在于service一直在后台运行且没有用户界面。

1.service的类图和生命周期

先来看看service的类图:

Android  Service类与生命周期详细介绍

接下来看看service的生命周期:

Android  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);
  }
}


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: