Android studio通过绑定式Service实现简易音乐播放器 您所在的位置:网站首页 qq音乐播放页面一闪一闪 Android studio通过绑定式Service实现简易音乐播放器

Android studio通过绑定式Service实现简易音乐播放器

2023-12-23 05:29| 来源: 网络整理| 查看: 265

目录

文章目录

前言

一、什么是Service?

二、演示视频

三、步骤

1.音乐文件

2.图片文件

3.代码

前言

最近开始学习Android studio,用绑定式Service做了一个退出自动停止的音乐播放器

一、什么是Service? Service是Android的四大组件之一,Service比Activity优先级高。Serive能在后台长时间运行且不提供用户界面,其应用场景为编写没有工作界面的服务程序和跨线程运行。Service根据使用方式,可分为显式启动和隐式启动;服务类的设计,与其启动方式有关。启动方式分为startService(非绑定方式)和bindService(绑定方式)两种;Service根据宿主程序,可划分为本地调用和远程服务调用。远程服务调用需要借助于AIDL。 二、演示视频

Android通过绑定式Service实现简易音乐播放器-CSDN直播

三、步骤 1.音乐文件

在res文件夹下添加raw文件夹,添加音乐文件,命名规则只能是a-z,0-9,和下划线_。不能有大写字母和 - 。

2.图片文件

图片文件粘贴到res文件夹下的drawable文件夹,命名规则同上。

 

 

 

 

 

3.代码

xml布局文件

activity.java文件

package cn.itcast.musicplayer; import android.animation.ObjectAnimator; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import androidx.appcompat.app.AppCompatActivity; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static SeekBar sb; private static TextView tv_progress, tv_total; private ObjectAnimator animator; private MusicService.MusicControl musicControl; MyServiceConn conn; Intent intent; private boolean isUnbind = false;//记录服务是否被解绑 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { tv_progress = findViewById(R.id.tv_progress); tv_total = findViewById(R.id.tv_total); sb = findViewById(R.id.sb); findViewById(R.id.btn_play).setOnClickListener(this); findViewById(R.id.btn_pause).setOnClickListener(this); findViewById(R.id.btn_continue_play).setOnClickListener(this); findViewById(R.id.btn_exit).setOnClickListener(this); intent = new Intent(this, MusicService.class);//创建意图对象 conn = new MyServiceConn(); //创建服务连接对象 bindService(intent, conn, BIND_AUTO_CREATE); //绑定服务 //为滑动条添加事件监听 sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //滑动条进度改变时,会调用此方法 if (progress == seekBar.getMax()) { //当滑动条滑到末端时,结束动画 animator.pause(); //停止播放动画 } } @Override public void onStartTrackingTouch(SeekBar seekBar) {//滑动条开始滑动时调用 } @Override public void onStopTrackingTouch(SeekBar seekBar) { //滑动条停止滑动时调用 //根据拖动的进度改变音乐播放进度 int progress = seekBar.getProgress();//获取seekBar的进度 musicControl.seekTo(progress); //改变播放进度 } }); ImageView iv_music = findViewById(R.id.iv_music); animator = ObjectAnimator.ofFloat(iv_music, "rotation", 0f, 360.0f); animator.setDuration(10000); //动画旋转一周的时间为10秒 animator.setInterpolator(new LinearInterpolator()); animator.setRepeatCount(-1); //-1表示设置动画无限循环 } public static Handler handler = new Handler() {//创建消息处理器对象 //在主线程中处理从子线程发送过来的消息 @Override public void handleMessage(Message msg) { Bundle bundle = msg.getData(); //获取从子线程发送过来的音乐播放进度 int duration = bundle.getInt("duration"); //歌曲的总时长 int currentPostition = bundle.getInt("currentPosition");//歌曲当前进度 sb.setMax(duration); //设置SeekBar的最大值为歌曲总时长 sb.setProgress(currentPostition);//设置SeekBar当前的进度位置 //歌曲的总时长 int minute = duration / 1000 / 60; int second = duration / 1000 % 60; String strMinute = null; String strSecond = null; if (minute < 10) { //如果歌曲的时间中的分钟小于10 strMinute = "0" + minute; //在分钟的前面加一个0 } else { strMinute = minute + ""; } if (second < 10) { //如果歌曲的时间中的秒钟小于10 strSecond = "0" + second;//在秒钟前面加一个0 } else { strSecond = second + ""; } tv_total.setText(strMinute + ":" + strSecond); //歌曲当前播放时长 minute = currentPostition / 1000 / 60; second = currentPostition / 1000 % 60; if (minute < 10) { //如果歌曲的时间中的分钟小于10 strMinute = "0" + minute;//在分钟的前面加一个0 } else { strMinute = minute + ""; } if (second < 10) { //如果歌曲的时间中的秒钟小于10 strSecond = "0" + second; //在秒钟前面加一个0 } else { strSecond = second + ""; } tv_progress.setText(strMinute + ":" + strSecond); } }; class MyServiceConn implements ServiceConnection { //用于实现连接服务 @Override public void onServiceConnected(ComponentName name, IBinder service) { musicControl = (MusicService.MusicControl) service; } @Override public void onServiceDisconnected(ComponentName name) { } } private void unbind(boolean isUnbind){ if(!isUnbind){ //判断服务是否被解绑 musicControl.pausePlay();//暂停播放音乐 unbindService(conn); //解绑服务 stopService(intent); //停止服务 } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_play: //播放按钮点击事件 musicControl.play(); //播放音乐 animator.start(); //播放动画 break; case R.id.btn_pause: //暂停按钮点击事件 musicControl.pausePlay(); //暂停播放音乐 animator.pause(); //暂停播放动画 break; case R.id.btn_continue_play: //继续播放按钮点击事件 musicControl.continuePlay(); //继续播放音乐 animator.start(); //播放动画 break; case R.id.btn_exit: //退出按钮点击事件 unbind(isUnbind); //解绑服务绑定 isUnbind = true; //完成解绑服务 finish(); //关闭音乐播放界面 break; } } @Override protected void onDestroy() { super.onDestroy(); unbind(isUnbind); //解绑服务 } }

service文件

package cn.itcast.musicplayer; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.Bundle; import android.os.IBinder; import android.os.Message; import java.util.Timer; import java.util.TimerTask; public class MusicService extends Service { private MediaPlayer player; private Timer timer; public MusicService() {} @Override public IBinder onBind(Intent intent) { return new MusicControl(); } @Override public void onCreate() { super.onCreate(); player = new MediaPlayer();//创建音乐播放器对象 } public void addTimer() { //添加计时器用于设置音乐播放器中的播放进度条 if (timer == null) { timer = new Timer(); //创建计时器对象 TimerTask task = new TimerTask() { @Override public void run() { if (player == null) return; int duration = player.getDuration(); //获取歌曲总时长 int currentPosition = player.getCurrentPosition();//获取播放进度 Message msg = MainActivity.handler.obtainMessage();//创建消息对象 //将音乐的总时长和播放进度封装至消息对象中 Bundle bundle = new Bundle(); bundle.putInt("duration", duration); bundle.putInt("currentPosition", currentPosition); msg.setData(bundle); //将消息发送到主线程的消息队列 MainActivity.handler.sendMessage(msg); } }; //开始计时任务后的5毫秒,第一次执行task任务,以后每500毫秒执行一次 timer.schedule(task, 5, 500); } } class MusicControl extends Binder { public void play() { try { player.reset();//重置音乐播放器 //加载多媒体文件 player = MediaPlayer.create(getApplicationContext(), R.raw.music); player.start();//播放音乐 addTimer(); //添加计时器 } catch (Exception e) { e.printStackTrace(); } } public void pausePlay() { player.pause(); //暂停播放音乐 } public void continuePlay() { player.start(); //继续播放音乐 } public void seekTo(int progress) { player.seekTo(progress);//设置音乐的播放位置 } } @Override public void onDestroy() { super.onDestroy(); if (player == null) return; if (player.isPlaying()) player.stop();//停止播放音乐 player.release(); //释放占用的资源 player = null; //将player置为空 } }

 

 

总结

以上就是我做的简易音乐播放器,希望能帮到和我一样刚开始学习Android studio的小白,本文的代码比较粗糙,欢迎大佬指正:)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有