第9章 服务(Service)——完整入门讲解

Service(服务)是 Android 四大组件之一,用于在后台执行长期运行的任务,例如:

  • 播放音乐

  • 后台下载

  • 定时任务

  • 计步、定位

  • 与客户端通信的后台处理


📌 目录


9.1 服务概述

Service 是一种没有界面、在后台运行的组件

特点:

  • 即使切换 Activity,服务仍继续运行

  • 占用内存少

  • 用于长期任务

常见用途:

  • 播放音乐

  • 后台下载图片/视频

  • 监听系统事件

  • 计步服务

  • 后台定时任务


9.2 服务的创建

创建服务只需两步:

步骤 1:新建 Service 类,继承 Service

public class MyService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "服务已创建");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService", "服务开始执行任务...");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyService", "服务已销毁");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null; // 若是 bindService 则需返回 Binder
    }
}

步骤 2:AndroidManifest.xml 注册

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

9.3 服务的生命周期

服务生命周期方法:

方法 触发时机 说明
onCreate() 服务第一次创建 一生只调用一次
onStartCommand() 调用 startService() 可多次调用
onBind() 调用 bindService() 返回与客户端通信的 Binder
onUnbind() 解绑绑定服务
onDestroy() 服务被销毁 释放资源

9.4 服务的启动方式

Service 有 两种启动方式


方式一:startService() 启动服务(后台长期运行)

调用 startService()

Intent intent = new Intent(this, MyService.class);
startService(intent);

停止服务

stopService(intent);

特点

  • 多次调用 startService() → 只执行一次 onCreate()

  • 必须主动 stopService() 或 Service 自己 stopSelf()

  • 常用于后台长期任务(音乐播放、下载)


方式二:bindService() 启动服务(服务绑定)

通常用于 Activity 与服务通信,比如:

  • Activity 控制音乐播放

  • Activity 获取服务实时数据(如计步)


步骤 1:在服务中创建 Binder(用于通信)

public class MyService extends Service {

    private final IBinder binder = new LocalBinder();

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

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

    public void play() {
        Log.d("Music", "播放音乐");
    }
}

步骤 2:在 Activity 中绑定服务

private MyService myService;
private boolean bound = false;

private ServiceConnection connection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.LocalBinder binder = (MyService.LocalBinder) service;
        myService = binder.getService();
        bound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        bound = false;
    }
};

绑定服务

Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);

解绑服务

unbindService(connection);

两种方式的区别总结

特性 startService() bindService()
生命周期 独立运行 与 Activity 绑定
调用 onStartCommand onBind
是否可通信 不能 能(Binder)
常见用途 后台下载、音乐 UI 控制音乐播放

9.5 服务的通信

分两种:


(1)本地服务通信(Binder)

适用于同一个 App。

常见方式:

  • 通过 Binder 调用服务的方法(如 playMusic())

  • Activity 通过 bindService() 与 Service 通信

示例:

myService.play();

(2)远程服务通信(AIDL)

适用于 多个 App 之间通信

特点:

  • 进程间通信 IPC

  • 通过 AIDL(Android 接口定义语言)

使用场景少见(用于大型项目/系统服务)。


9.6 实战演练——音乐播放器(Service + MediaPlayer)

实现功能:

  • 点击按钮启动播放

  • 后台播放音乐

  • Activity 关闭后音乐继续播放

  • 使用 startService()


步骤 1:创建音乐服务 MusicService

public class MusicService extends Service {

    private MediaPlayer player;

    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.music); // 把 music.mp3 放在 res/raw
        player.setLooping(true);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        player.stop();
        player.release();
        super.onDestroy();
    }

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

步骤 2:Manifest 注册

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

步骤 3:Activity 控制播放

public void startMusic(View view) {
    Intent intent = new Intent(this, MusicService.class);
    startService(intent);
}

public void stopMusic(View view) {
    Intent intent = new Intent(this, MusicService.class);
    stopService(intent);
}

对应布局(按钮):

<Button
    android:id="@+id/btn_start"
    android:onClick="startMusic"
    android:text="播放音乐"/>

<Button
    android:id="@+id/btn_stop"
    android:onClick="stopMusic"
    android:text="停止音乐"/>

运行效果:

  • 点“播放音乐”→ 背景开始播放 mp3

  • 切换页面仍继续播放

  • 点“停止音乐”→ 停止播放


第9章 总结(超清晰)

知识点 内容
Service 概述 后台运行、无界面
生命周期 onCreate → onStartCommand/onBind → onDestroy
startService 后台长期任务(音乐、下载)
bindService Activity 与服务通信
本地通信 Binder
远程通信 AIDL
实战 音乐播放器(MediaPlayer + Service)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐