如果说Android应用的四大组件是“后宫天团”,那Activity绝对是C位出道的流量小花——光鲜亮丽,掌管用户界面;而Service则是深藏功与名的扫地僧,常年躲在后台默默干活。很多新手一开始会觉得:“这货存在感这么低,学了有啥用?”直到某天你的音乐播放器切到后台就自闭,下载任务锁屏就中断,才捶胸顿足:“原来Service才是真大佬!”
其实Service就像公司里的运维部门:用户看不见他们改bug、拉网线,但整个系统离了他们立马瘫痪。今天咱们就用追剧的心态,扒一扒Service家族的三大派系,顺便手把手教你写个“打不死的”音乐播放服务。
startService()后立刻进入“勿扰模式”,哪怕主人(用户)跑去刷抖音了,它还在默默执行下载文件、同步数据这些脏活累活寿命玄学:活到自己想不开(调用
stopSelf())或被老板(系统)强制裁员(内存不足时优先被kill)适用场景:上传用户相册到云端、定期备份聊天记录这种“不需要刷脸”的任务
代码彩蛋——后台服务简易模板:
// 继承Service的打工仔基础配置
public class ToolManService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 在后台偷偷搞事情(实际开发记得开线程!)
new Thread(() -> {
// 模拟下载任务
while (!isDownloadFinished) {
SystemClock.sleep(1000);
Log.d("摸鱼日志", "正在假装努力下载...");
}
}).start();
return START_STICKY; // 被系统干掉后尝试复活
}
@Override
public IBinder onBind(Intent intent) {
return null; // 高冷拒绝绑定
}
}
避坑指南:忘记给通知栏设置ChannelId?恭喜你获得Crash大礼包!Android 8.0后必须创建通知渠道:
// 在Service的onCreate里设置网红出道位
void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(
"music_channel",
"音乐直播间",
NotificationManager.IMPORTANCE_LOW
);
getSystemService(NotificationManager.class).createNotificationChannel(channel);
}
}
onBind()返回IBinder接口,像递名片一样建立通信桥梁关系网:可同时服务多个组件(Activity/Fragment等),最后一个“金主”断开连接时自动下岗高级玩法:搭配Messenger实现跨进程通信(IPC),让两个APP像聊微信一样传数据
灵魂画手解读:想象绑定服务是家咖啡馆,IBinder是点单二维码——Activity扫码后就能呼叫服务员(Service)送咖啡(返回数据)。
现在我们来个全家桶式代码,融合启动式+绑定式服务,实现一个切到后台也能播歌,还能被多个界面控制的播放器:
// 戏精音乐服务登场(同时继承启动+绑定双重人格)
public class MusicService extends Service {
private MediaPlayer mediaPlayer;
private final IBinder binder = new MusicBinder();
// 定义和Activity的通信暗号
public class MusicBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = MediaPlayer.create(this, R.raw.gangtai);
mediaPlayer.setLooping(true);
// 前台服务化妆间
buildNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 收到启动指令就开唱
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// 露出职业微笑迎接绑定
return binder;
}
// 前台服务专属化妆术
private void buildNotification() {
Notification notification = new NotificationCompat.Builder(this, "music_channel")
.setContentTitle("灵魂DJ在线打碟")
.setContentText("正在播放:《野狼Disco》")
.setSmallIcon(R.drawable.ic_music_note)
.build();
startForeground(1, notification);
}
// 对外暴露的播放控制接口
public void pauseMusic() {
if (mediaPlayer.isPlaying()) mediaPlayer.pause();
}
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public void onDestroy() {
// 下班收拾道具
mediaPlayer.stop();
mediaPlayer.release();
stopForeground(true);
}
}
在Activity里的调戏方式:
// 启动服务保证后台持续播放
startService(new Intent(this, MusicService.class));
// 绑定服务获取控制权
bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);
// 通过Binder拿到服务遥控器
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
musicService = binder.getService();
// 现在可以随时切歌/暂停了!
}
};
onDestroy()里乖乖调用
unbindService()ANR暴击警告:在Service主线程执行耗时任务?系统分分钟用ANR弹窗教你做人。务必开Worker线程或者直接启用IntentService(已弃用,建议用WorkManager替代)后台限制刺客:Android 9开始对后台应用各种限制,别怪Service突然自闭,要学会用
JobScheduler或
WorkManager等“合规姿势”生命周期迷惑行为:同时被启动和绑定的Service,必须等所有绑定断开+收到stop命令才会销毁,像极了不想下班的打工人
随着Android对后台管理越来越严,传统Service的生存空间正在被挤压。现在官方更推荐:
WorkManager:定时任务新宠,自动兼容不同系统版本Foreground Service:需要持续用户感知的任务必备绑定服务:组件间通信的首选,轻量又高效记住技术选型口诀:能绑不定不启动,能前台不后台,能WorkManager不裸奔Service!
总结
Service就像Android世界的底层基建狂魔,掌握它的分类和实战技巧,相当于获得了让应用“活得更久”的魔法书。现在就去给你的APP配个“服务天团”吧——当别人家的应用在后台被杀得片甲不留时,你的服务依然坚挺地唱着:“我还是从前那个少年,没有一丝丝改变~”
¥278.00
【全21册】中华历代帝王传精装版 唐宋元明清三国皇帝全传秦始皇李世民女皇武则天成吉思汗康熙乾隆朱元璋朱棣汉武帝等传记全套
¥269.00
20册历史穿越报帝王卷朝代卷夏商西周春秋战国秦汉三国秦始皇刘邦汉武李世民赵匡胤成吉思汗朱元璋康熙7-12岁中国历史中小学生读物
¥18.58
//-古代三国帝王杯爵辛父古代杯酒杯三角秦朝爵道具婚礼.包酒杯酒
¥57.00
能臣与英雄 曹操大传 全套2册 南门太守著 曹孟德历代帝王三国权臣枭雄历史人物传记书籍三十年时间追踪曹操的足迹 现代出版社
¥17.79
-古代三国帝王杯爵辛父古代杯酒杯三角秦朝爵道具婚礼.包酒杯酒-
¥186.80
正版现货9787510700729正版库存一手 图说历代帝王 三国两晋南北朝篇 时涛,熊念旭著 中国长安出版社 9787510700729