在 Android 中启动 Service 主要有两种方式:

1. 通过 startService() 启动

这种方式主要用于执行后台任务,例如下载文件、上传数据等长时间运行的任务。服务的生命周期与启动它的组件无关,即使启动它的 Activity 已经销毁,服务仍然继续运行。

示例代码:

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

// 在MyService类中
public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 执行长时间运行的任务
        return START_STICKY; // 服务被意外终止后会自动重启
    }

    @Override
    public void onCreate() {
        super.onCreate();
        // 服务创建时调用
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 服务销毁时调用
    }

    @Override
    public IBinder onBind(Intent intent) {
        // 不需要绑定,返回null
        return null;
    }
}

2. 通过 bindService() 启动

这种方式主要用于让客户端和服务端之间进行交互,例如通过 AIDL 实现的远程过程调用。服务的生命周期依赖于绑定它的组件,如果所有组件都解绑了服务,那么服务会被销毁。

示例代码:

// 在Activity中绑定Service
Intent intent = new Intent(this, MyService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);

// 定义ServiceConnection
ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // 服务绑定成功后的回调
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // 服务解绑后的回调
    }
};

// 在MyService类中
public class MyService extends Service {
    private LocalBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 如果需要处理长时间运行的任务,这里可以实现
        return START_NOT_STICKY; // 默认值,服务一旦终止不会自动重启
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // 服务解绑时调用,返回true表示服务希望在最后一个客户端断开连接后继续运行
        return super.onUnbind(intent);
    }
}

注意事项

  • 当使用 startService() 启动服务时,如果服务已经启动,则只会调用 onStartCommand() 方法,而不会重新调用 onCreate() 方法。
  • 使用 bindService() 启动的服务,在最后一个客户端解绑后,如果没有其他服务维持其运行,服务将会被销毁。
  • 服务可以通过 stopSelf() 或者从 Activity 中调用 stopService() 来停止自己。
  • 如果服务需要与 Activity 进行交互,通常使用 bindService() 方式启动。
  • 如果服务只是执行一些后台任务,并不需要与 Activity 交互,可以选择 startService() 方式启动。