Skip to content

Service组件

长期运行在后台,且不提供用户界面。即使用户切换到其他应用,服务仍能在后台继续运行。

类型(不互斥,与实现的回调方法有关)

  • 启动服务:start service,程序内部,执行单个操作,不与其它组件交互信息。通常在执行完操作后,服务会自动停止自身。 回调方法:int onStartCommand(Intent intent, int flags, int startId),调用startService()时调用。
  • 绑定服务:bind service,多程序之间,提供客户端-服务端接口,允许与其它组件和服务交换信息(发送请求、获取结果,甚至进行进程间通信 IPC)。多个组件可以绑定到同一个服务上,当所有绑定都解除后,服务即被销毁。 回调方法:IBinder onBind(Intent intent),调用bindService()时执行。

其它回调方法

  • onCreate():首次创建服务时调用(在 onStartCommand()onBind() 之前调用,如果服务已在运行则不会被调用)。
  • onDestroy():服务不再使用且被销毁时调用。应在此方法中清理资源,如线程、已注册的监听器、接收器等。
  • onUnbind():绑定的客户端全部解绑时调用。

生命周期

image-20260610085823222

创建与注册

  1. 自定义继承Service的类,重写onBind()方法(无论是绑定还是启动服务都要写

    1
    2
    3
    4
    5
    6
    7
    public class MyService extends Service {
        @Override
        public IBinder onBind(Intent intent) {
            //如果后续作为启动服务则只需要写:
            return null;
        }
    }
    
  2. 在AndroidManifest.xml文件中注册Service

    节点中添加一个<service android:name=".Service类名"/>标签。

启动与停止

  • 在Activity中启动一个Service
    Intent intent=new Intent(当前Activity.this,要启动的Service.class);
    startService(intent);
    
  • 在Activity中停止一个Service
    1
    2
    3
    Intent intent=new Intent(当前Activity.this,要停止的Service.class);
    stopService(intent);
    // 也可以在Service内部调用 stopSelf() 来停止自身
    

绑定与解绑

  • 在Activity中绑定一个Service

    需要创建一个 ServiceConnection 对象,用于监控与Service的连接状态(需重写 onServiceConnectedonServiceDisconnected 方法)。

    1
    2
    3
    Intent intent = new Intent(当前Activity.this, 要绑定的Service.class);
    // flags通常传入 Context.BIND_AUTO_CREATE 表示绑定时自动创建服务
    bindService(intent, conn, Context.BIND_AUTO_CREATE); 
    
  • 在Activity中解绑一个Service
    unbindService(conn);
    

IntentService

Service默认运行在其托管进程的主线程中,它既不创建自己的线程,也不在单独的进程中运行。如果服务执行密集型或阻塞性操作,会导致ANR(应用程序无响应),因此必须在Service内创建新的线程来完成这些耗时工作。

一种简化的实现是使用IntentService,它是Service的子类。它每次都会使用一个新的工作线程逐一处理全部启动请求(一次处理一个意图,不会阻塞主线程)。

实现要求:

  1. 提供一个空构造函数,并在内部调用 super("工作线程名称")
  2. 重写 onHandleIntent(Intent intent) 方法,在这里执行具体的后台耗时操作。
  3. 工作任务执行完毕后,IntentService会自动停止,开发者无需手动调用 stopSelf()