第9章 服务
必须主动 stopService() 或 Service 自己 stopSelf()Activity 通过 bindService() 与 Service 通信。通过 Binder 调用服务的方法(如 playMusic())Activity 获取服务实时数据(如计步)即使切换 Activity,服务仍继续运行。使用场景少见(用于大型项目/系统服务)。点“播放音乐”→ 背景开始播放 mp3。使用
第9章 服务(Service)——完整入门讲解
Service(服务)是 Android 四大组件之一,用于在后台执行长期运行的任务,例如:
-
播放音乐
-
后台下载
-
定时任务
-
计步、定位
-
与客户端通信的后台处理
📌 目录
-
-
startService()
-
bindService()
-
-
-
本地服务通信
-
远程服务通信(AIDL)
-
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) |
更多推荐



所有评论(0)