【Android基础】四大组件之Service

【Android基础】四大组件之Service

本文介绍了四大组件之Service的相关内容。

概念

Service,即服务,主要用于在后台执行长时间运行的操作。它提供了一种标准的方式来执行异步任务。可以让应用完成后台任务的部署。同时,还可以建立进程间通信,使得不同应用可以共享数据,而不需要了解对方的内部实现。

Service的创建与使用

Service的使用分为以下几个步骤:

  1. 手动创建Service的子类。
  2. 在AndroidManifest.xml文件中注册这个Service。
  3. 实现Service的抽象方法。
  4. 通过start或者bind的方法启动service

代码示例:

<service android:name=".MyService" />

Service的生命周期

Service的生命周期分为以下几个阶段:

  1. onCreate():Service被创建时调用。
  2. onStartCommand():Service被启动时调用。
  3. onBind():Service被绑定时调用。
  4. onUnbind():Service被解绑时调用。
  5. onDestroy():Service被销毁时调用。

Service的分类

Service分为以下几种类型:

  1. 前台Service:前台Service会一直保持运行状态,并且会显示在通知栏中。
  2. 后台Service:后台Service会在系统内存不足时被回收。
  3. 绑定Service:绑定Service会在Service和客户端之间建立一个连接,并且可以在客户端和Service之间传递数据。

Service的启动方式

Service的启动方式分为以下几种:

  1. startService():启动Service,但是Service会在后台运行,并且不会和调用者有直接的联系。
  2. bindService():绑定Service,Service会和调用者建立一个连接,并且可以在客户端和Service之间传递数据。
  3. startForeground():启动前台Service,Service会在通知栏中显示一个通知,并且可以在通知栏中进行操作。

代码示例:

// 1. 启动Service
Intent intent = new Intent(this, MyService.class);
startService(intent);

// 2. 绑定Service
Intent intent = new Intent(this, MyService.class);
// 创建一个ServiceConnection对象,并重写两个方法:
// onServiceConnected():Service连接成功时调用。
// onServiceDisconnected():Service连接断开时调用。
ServiceConnection connection = new MyServiceConnection(){
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 获取Service的实例
        MyService myService = ((MyService.MyBinder)service).getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // Service连接断开时调用 
    }
};

bindService(intent, connection, Context.BIND_AUTO_CREATE);

unbindService(connection);

stopService(intent);
  1. 直接start时,如果创建成功,Service内部会回调onCreate方法,然后回调onStartCommand方法。启动前台Service时,一样会回调onStartCommand方法,然后回调onStartForeground方法。

  2. bind时,会回调onCreate方法,然后回调onBind方法。

结束Service的方式

结束Service的方式分为以下几种:

  1. stopService():停止Service,通过start方式拉起的Service在停止之后会被销毁。回调onDestroy()方法。
  2. unbindService():解除Service和调用者的连接。当所有的调用者都解除连接时,Service会被销毁。

Service被销毁时,会回调onDestroy()方法,我们就可以在这里做一些清理工作。

代码示例:

// 停止Service
Intent intent = new Intent(this, MyService.class);
stopService(intent);

// 解除Service和调用者的连接
unbindService(connection);

另外,service内部也可以自己停止,调用stopSelf()方法。

// 停止Service
stopSelf();