当前位置: 首页 > news >正文

logosc网站怎么做的杭州网站运营

logosc网站怎么做的,杭州网站运营,企业管理咨询考试题及答案,wordpress 色给定部分完成的MusicPlayer项目#xff0c;实现其中未完成的service部分#xff1a; 1、创建MusicService类#xff0c;通过service组件实现后台播放音乐的功能#xff1b; 2、在MainActivity中通过ServiceConnection连接MusicService#xff0c;实现对音乐播放的控制实现其中未完成的service部分 1、创建MusicService类通过service组件实现后台播放音乐的功能 2、在MainActivity中通过ServiceConnection连接MusicService实现对音乐播放的控制 3、使用Handler机制在MainActivity和MusicService之间进行通信。 目前已有代码 相关的资源文件可自行寻找 activity_main.xml ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:backgrounddrawable/music_bgandroid:gravitycenterandroid:orientationverticalRelativeLayoutandroid:layout_widthmatch_parentandroid:layout_height160dptools:ignoreUselessParentRelativeLayoutandroid:idid/rl_titleandroid:layout_width300dpandroid:layout_height70dpandroid:layout_centerHorizontaltrueandroid:backgrounddrawable/title_bgandroid:gravitycenter_horizontalandroid:paddingStart80dptools:ignoreRtlSymmetryTextViewandroid:idid/tv_music_titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop8dpandroid:textstring/song_nameandroid:textSize12spandroid:textStyleboldandroid:textColorandroid:color/black/TextViewandroid:layout_marginTop4dpandroid:idid/tv_typeandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/tv_music_titleandroid:layout_alignStartid/tv_music_titleandroid:textstring/pop_musicandroid:textSize10sptools:ignoreSmallSp /SeekBarandroid:idid/sbandroid:layout_width150dpandroid:layout_heightwrap_contentandroid:layout_belowid/rl_timeandroid:layout_alignParentBottomtrueandroid:thumbnull /RelativeLayoutandroid:layout_marginTop4dpandroid:idid/rl_timeandroid:layout_width150dpandroid:layout_heightwrap_contentandroid:layout_belowid/tv_typeTextViewandroid:idid/tv_progressandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textstring/zero_timeandroid:textSize10sptools:ignoreSmallSp /TextViewandroid:idid/tv_totalandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_alignParentEndtrueandroid:textstring/zero_timeandroid:textSize10sptools:ignoreRelativeOverlap,SmallSp //RelativeLayout/RelativeLayoutLinearLayoutandroid:layout_width340dpandroid:layout_height90dpandroid:layout_belowid/rl_titleandroid:layout_centerHorizontaltrueandroid:backgrounddrawable/btn_bgandroid:gravitycenter_verticalandroid:paddingStart120dpandroid:paddingEnd10dpButtonandroid:idid/btn_playandroid:layout_width0dpandroid:layout_height25dpandroid:layout_margin4dpandroid:layout_weight1android:backgrounddrawable/btn_bg_selectorandroid:textstring/playandroid:textSize10sptools:ignoreButtonStyle,SmallSp /Buttonandroid:idid/btn_pauseandroid:layout_width0dpandroid:layout_height25dpandroid:layout_margin4dpandroid:layout_weight1android:backgrounddrawable/btn_bg_selectorandroid:textstring/pauseandroid:textSize10sptools:ignoreButtonStyle,SmallSp /Buttonandroid:idid/btn_continue_playandroid:layout_width0dpandroid:layout_height25dpandroid:layout_margin4dpandroid:layout_weight1android:backgrounddrawable/btn_bg_selectorandroid:textstring/contandroid:textSize10sptools:ignoreButtonStyle,SmallSp /Buttonandroid:idid/btn_exitandroid:layout_width0dpandroid:layout_height25dpandroid:layout_margin4dpandroid:layout_weight1android:backgrounddrawable/btn_bg_selectorandroid:textstring/exitandroid:textSize10sptools:ignoreButtonStyle,SmallSp //LinearLayoutImageViewandroid:idid/iv_musicandroid:layout_width100dpandroid:layout_height100dpandroid:layout_centerVerticaltrueandroid:layout_marginStart35dpandroid:layout_marginBottom50dpandroid:srcdrawable/img_musicandroid:contentDescriptionstring/iv //RelativeLayout /LinearLayout MainActivity.java package cn.itcast.musicplayer;import android.animation.ObjectAnimator; import android.os.Bundle; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static SeekBar sb;private static TextView tv_progress, tv_total;private ObjectAnimator animator;Overrideprotected 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);//为滑动条添加事件监听sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, booleanfromUser) { //滑动条进度改变时会调用此方法if (progress seekBar.getMax()) { //当滑动条滑到末端时结束动画animator.pause(); //停止播放动画}}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {//滑动条开始滑动时调用}Overridepublic void onStopTrackingTouch(SeekBar seekBar) { //滑动条停止滑动时调用//根据拖动的进度改变音乐播放进度int progress seekBar.getProgress();//获取seekBar的进度}});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表示设置动画无限循环}Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_play: //播放按钮点击事件animator.start(); //播放动画break;case R.id.btn_pause: //暂停按钮点击事件animator.pause(); //暂停播放动画break;case R.id.btn_continue_play: //继续播放按钮点击事件animator.start(); //播放动画break;case R.id.btn_exit: //退出按钮点击事件finish(); //关闭音乐播放界面break;}}Overrideprotected void onDestroy() {super.onDestroy();//解绑服务} } 当前已经有一个用户界面其中包括了播放、暂停、继续播放和退出按钮以及一个旋转动画效果。现在我们需要将MusicService与MainActivity连接起来以实现音乐的播放和控制功能。 步骤1创建MusicService类 单击鼠标右键并选择【New】–【Service】–【Service】 步骤 1: 创建 MusicService 类 首先你需要创建一个名为 MusicService 的类该类将负责处理音乐播放和与 MainActivity 之间的通信。 这里你需要准备一个mp3格式的文件 package cn.itcast.musicplayer;import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder;public class MusicService extends Service {private MediaPlayer mediaPlayer;public MusicService() {}Overridepublic IBinder onBind(Intent intent) {return new MusicBinder();}public class MusicBinder extends Binder {MusicService getService() {return MusicService.this;}}Overridepublic void onCreate() {super.onCreate();mediaPlayer new MediaPlayer();// 在这里设置音乐资源例如 mediaPlayer.setDataSource(your_music_uri);mediaPlayer MediaPlayer.create(this, R.raw.music); // 加载音乐资源}// 添加播放音乐的方法public void playMusic() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}// 添加暂停音乐的方法public void pauseMusic() {if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}// 添加继续播放音乐的方法public void continueMusic() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}Overridepublic void onDestroy() {if (mediaPlayer ! null) {mediaPlayer.release();mediaPlayer null;}super.onDestroy();} }相关变量描述 MusicService 是一个 Android 服务类用于处理音乐播放相关的功能。 mediaPlayer 是用于播放音乐的 MediaPlayer 对象它负责加载音乐资源、播放、暂停和继续播放音乐。 MusicBinder 内部类继承自 Binder用于绑定服务与其他组件之间的通信。 onBind 方法用于返回 MusicBinder 对象以便其他组件可以与服务进行绑定。 onCreate 方法在服务创建时被调用它初始化了 mediaPlayer 并加载音乐资源。在这个示例中音乐资源是从 R.raw.music 中加载的。 playMusic 方法用于播放音乐如果音乐未在播放状态则调用 mediaPlayer.start() 来开始播放。 pauseMusic 方法用于暂停音乐如果音乐正在播放则调用 mediaPlayer.pause() 来暂停。 continueMusic 方法用于继续播放音乐如果音乐已暂停则调用 mediaPlayer.start() 来继续播放。 onDestroy 方法在服务销毁时被调用它释放了 mediaPlayer 对象的资源确保不会产生内存泄漏。 服务允许其他组件与其绑定以控制音乐的播放、暂停和继续播放载了一个音乐资源在这个示例中是 R.raw.music并使用 MediaPlayer 对象进行音乐播放 在AndroidManifest.xml中注册MusicService检查 确保在AndroidManifest.xml文件中注册MusicService以便应用能够正常启动该服务。 一般在我们创建service文件后会自动进行注册的 service android:name.MusicService /步骤 2: 在 MainActivity 中连接 MusicService 在 MainActivity 中添加代码来连接 MusicService 并控制音乐的播放、暂停和继续。 private MusicService musicService; private boolean isBound false;private ServiceConnection serviceConnection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MusicService.MusicBinder binder (MusicService.MusicBinder) service;musicService binder.getService();isBound true;}Overridepublic void onServiceDisconnected(ComponentName name) {isBound false;} };Override protected void onStart() {super.onStart();Intent intent new Intent(this, MusicService.class);bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); }Override protected void onStop() {super.onStop();if (isBound) {unbindService(serviceConnection);isBound false;} }步骤 3: 在 MainActivity 中调用 MusicService 的方法 在 onClick 方法中调用 MusicService 的方法来控制音乐的播放、暂停和继续。 Override public void onClick(View v) {switch (v.getId()) {case R.id.btn_play: // 播放按钮点击事件if (isBound) {musicService.playMusic();}animator.start(); // 播放动画break;case R.id.btn_pause: // 暂停按钮点击事件if (isBound) {musicService.pauseMusic();}animator.pause(); // 暂停播放动画break;case R.id.btn_continue_play: // 继续播放按钮点击事件if (isBound) {musicService.continueMusic();}animator.start(); // 播放动画break;case R.id.btn_exit: // 退出按钮点击事件finish(); // 关闭音乐播放界面break;} }当前我们就已经初步完成了简单音乐播放器的播放、暂停、继续、退出功能 你可以尝试此时运行项目测试效果 步骤 4: 修改MusicService以实现通信更新UI 添加获取相关信息函数 // 获取音乐总时长public int getTotalDuration() {return mediaPlayer.getDuration();}// 获取音乐当前播放进度public int getCurrentPosition() {return mediaPlayer.getCurrentPosition();}// 设置音乐播放进度public void seekTo(int position) {mediaPlayer.seekTo(position);}// 更新UI发送消息给MainActivityprivate void updateUI(int progress, int totalDuration) {if (handler ! null) {Message message Message.obtain(handler, UPDATE_UI, progress, totalDuration);handler.sendMessage(message);}}Overridepublic void onCreate() {super.onCreate();mediaPlayer MediaPlayer.create(this, R.raw.music); // 加载音乐资源mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mp) {// 音乐播放完成时的处理}});// 定时发送消息以更新UIRunnable runnable new Runnable() {Overridepublic void run() {if (mediaPlayer ! null mediaPlayer.isPlaying()) {int progress mediaPlayer.getCurrentPosition();int totalDuration mediaPlayer.getDuration();updateUI(progress, totalDuration);}handler.postDelayed(this, DELAY_MILLIS);}};handler.postDelayed(runnable, DELAY_MILLIS);} 这段代码是为 MusicService 添加了一些重要的功能以实现与 MainActivity 之间的通信并更新UI。以下是代码的描述 getTotalDuration 函数用于获取音乐的总时长。它通过 mediaPlayer.getDuration() 方法获取音乐的总时长然后返回该值。 getCurrentPosition 函数用于获取音乐的当前播放进度。通过 mediaPlayer.getCurrentPosition() 方法获取音乐的当前播放进度然后返回该值。 seekTo 函数用于设置音乐的播放进度。接受一个整数参数 position表示要设置的音乐播放进度并使用 mediaPlayer.seekTo(position) 方法来实现进度的跳转。 updateUI 函数用于发送消息给 MainActivity以便更新UI元素。它接受两个参数分别是当前播放进度 progress 和音乐总时长 totalDuration。它创建一个 Message 对象并通过 handler.sendMessage(message) 发送消息给 MainActivity以便更新UI元素比如进度条和文本。 在 onCreate 方法中定时发送消息以更新UI。通过一个 Runnable 定时任务在其中获取当前播放进度和音乐总时长然后调用 updateUI 函数发送消息给 MainActivity以实现不断更新UI元素的目的。 这些函数和逻辑使 MusicService 能够与 MainActivity 进行通信传递音乐播放进度和总时长以便 MainActivity 能够更新UI元素提供用户友好的音乐播放体验。 步骤 5: 修改MainActivity以实现通信更新UI 在MusicService中获取音乐总时长并在MainActivity中更新tv_total和进度条的位置以及格式化音乐的总时长和进度。 private static final int UPDATE_UI 1;public final static Handler handler new Handler(Looper.getMainLooper()) {Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what UPDATE_UI) {int progress msg.arg1;int totalDuration msg.arg2;updateUI(progress, totalDuration);}}};public static void updateUI(int progress, int totalDuration) {sb.setProgress(progress);tv_progress.setText(formatDuration(progress));// 更新左侧显示的总时间tv_total.setText(formatDuration(totalDuration));}// 辅助方法来更新进度private void updateProgress(int progress) {tv_progress.setText(formatDuration(progress));}// 辅助方法来格式化音乐时长private static String formatDuration(int duration) {int minutes (duration / 1000) / 60;int seconds (duration / 1000) % 60;return String.format(Locale.getDefault(), %02d:%02d, minutes, seconds);}// 添加方法来更新总时长private void updateTotalDuration(int duration) {tv_total.setText(formatDuration(duration));sb.setMax(duration);}private ServiceConnection serviceConnection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MusicService.MusicBinder binder (MusicService.MusicBinder) service;musicService binder.getService();isBound true;// 获取音乐总时长并更新UIint totalDuration musicService.getTotalDuration();updateTotalDuration(totalDuration);}Overridepublic void onServiceDisconnected(ComponentName name) {isBound false;}};private void init() {// 初始化控件和按钮点击事件监听tv_progress findViewById(R.id.tv_progress);tv_total findViewById(R.id.tv_total);sb findViewById(R.id.sb);// ...sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (progress seekBar.getMax()) {animator.pause();}updateProgress(progress);}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// 更新音乐播放进度int progress seekBar.getProgress();musicService.seekTo(progress); // 添加 seekTo 方法用于定位音乐进度}});// ...这段代码是为 MainActivity 添加了与 MusicService 之间的通信以便实现音乐播放进度的动态更新和音乐总时长的显示。以下是代码的描述 在 MainActivity 中定义了一个 handler这是一个静态的 Handler 对象它用于处理从 MusicService 发送的消息以便更新UI元素。通过 UPDATE_UI 常量来标识消息类型。 updateUI 函数是用于更新UI元素的核心方法。接受两个参数分别是当前播放进度 progress 和音乐总时长 totalDuration。在这个方法中进度条的位置会被设置为当前播放进度左侧的文本 tv_progress 会被更新为格式化后的播放进度而左侧的总时长文本 tv_total 会被更新为格式化后的音乐总时长。 updateProgress 方法是一个辅助方法用于更新播放进度。接受一个参数 progress并更新左侧的文本 tv_progress 为格式化后的播放进度。 formatDuration 方法是一个辅助方法用于格式化音乐时长。接受一个整数 duration表示音乐的时长以毫秒为单位然后将其格式化为分:秒的形式。 updateTotalDuration 方法用于更新总时长。它接受一个参数 duration表示音乐的总时长并更新左侧的总时长文本 tv_total 为格式化后的音乐总时长并设置进度条的最大值为音乐的总时长。 在 serviceConnection 中当 MusicService 与 MainActivity 连接成功后会获取音乐的总时长并调用 updateTotalDuration 方法来更新UI元素。 在 sbSeekBar的事件监听器中通过 onProgressChanged 方法当进度条的进度发生变化时会调用 updateProgress 方法来更新左侧的播放进度文本。在 onStopTrackingTouch 方法中当用户拖动进度条时会调用 musicService.seekTo(progress) 方法来定位音乐的进度。 这些代码改动使 MainActivity 能够与 MusicService 协同工作以实现音乐播放进度的动态更新和音乐总时长的显示。这对于提供用户友好的音乐播放体验至关重要。 步骤 6: 增加音乐结束后的处理细节 对于这些新的问题我们可以进行以下修改和处理 停止动画 随着音乐播放的完成动画应该随之停止。我们在 MusicService 中添加了一个音乐播放完成回调以便在音乐结束时暂停动画。这样用户可以看到音乐已经完成同时动画不再旋转提供了明确的视觉指示。如下所示 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mp) {// 音乐播放完成时的处理animator.pause(); // 停止动画} });左侧动的文字内容无法到达最大值 为了确保在音乐播放完成后左侧的时间文本达到最大值我们在音乐播放完成回调中更新了左侧的时间文本。通过调用 tv_progress.setText(formatDuration(getTotalDuration()))我们将左侧的时间文本设置为音乐的总时长以表明音乐已完成 Overridepublic void onCreate() { //……Overridepublic void onCompletion(MediaPlayer mp) {// 音乐播放完成时的处理animator.pause(); // 停止动画tv_progress.setText(formatDuration(getTotalDuration()));}});} 在音乐播放完成后没有提醒 我们添加了一种通知用户音乐已完成的方式。在 MusicService 中的音乐播放完成回调中我们使用showToast函数显示一个短暂的提示消息。这种提醒可以根据你的需求进行扩展例如你可以选择显示通知、执行其他操作或添加更多的用户反馈。 private void showToast(String message) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show();}Overridepublic void onCreate() { //……Overridepublic void onCompletion(MediaPlayer mp) {// 音乐播放完成时的处理animator.pause(); // 停止动画showToast(音乐已完成); // 显示音乐播放完成的提示}});}完整代码 MainActivity.java package cn.itcast.musicplayer;import static cn.itcast.musicplayer.MusicService.mediaPlayer;import android.animation.ObjectAnimator; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.Bundle; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity;import java.util.Locale;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static SeekBar sb;public static TextView tv_progress, tv_total;public static ObjectAnimator animator;private MusicService musicService;private boolean isBound false;private static final int UPDATE_UI 1;// 辅助方法来格式化音乐时长public static String formatDuration(int duration) {int minutes (duration / 1000) / 60;int seconds (duration / 1000) % 60;return String.format(Locale.getDefault(), %02d:%02d, minutes, seconds);}// 添加方法来更新总时长private void updateTotalDuration(int duration) {tv_total.setText(formatDuration(duration));sb.setMax(duration);}// 辅助方法来更新进度private void updateProgress(int progress) {tv_progress.setText(formatDuration(progress));}private ServiceConnection serviceConnection new ServiceConnection() {Overridepublic void onServiceConnected(ComponentName name, IBinder service) {MusicService.MusicBinder binder (MusicService.MusicBinder) service;musicService binder.getService();isBound true;// 获取音乐总时长并更新UIint totalDuration musicService.getTotalDuration();updateTotalDuration(totalDuration);}Overridepublic void onServiceDisconnected(ComponentName name) {isBound false;}};public final static Handler handler new Handler(Looper.getMainLooper()) {Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what UPDATE_UI) {int progress msg.arg1;int totalDuration msg.arg2;updateUI(progress, totalDuration);}}};public static void updateUI(int progress, int totalDuration) {sb.setProgress(progress);tv_progress.setText(formatDuration(progress));tv_total.setText(formatDuration(totalDuration));}Overrideprotected 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);// ...sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {if (progress seekBar.getMax()) {animator.pause();}updateProgress(progress);}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// 更新音乐播放进度int progress seekBar.getProgress();musicService.seekTo(progress); // 添加 seekTo 方法用于定位音乐进度}});// 初始化动画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表示设置动画无限循环}Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_play:if (isBound) {musicService.playMusic();}animator.start();break;case R.id.btn_pause:if (isBound) {musicService.pauseMusic();}animator.pause();break;case R.id.btn_continue_play:if (isBound) {musicService.continueMusic();}animator.start();break;case R.id.btn_exit:finish();break;}}Overrideprotected void onStart() {super.onStart();Intent intent new Intent(this, MusicService.class);bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);}Overrideprotected void onDestroy() {super.onDestroy();//解绑服务if (isBound) {unbindService(serviceConnection);isBound false;}} } MusicService.java package cn.itcast.musicplayer;import static cn.itcast.musicplayer.MainActivity.formatDuration; import static cn.itcast.musicplayer.MainActivity.handler; import static cn.itcast.musicplayer.MainActivity.animator; import static cn.itcast.musicplayer.MainActivity.tv_progress;import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.widget.Toast;public class MusicService extends Service {public static MediaPlayer mediaPlayer;private final IBinder binder new MusicBinder();private final int UPDATE_UI 1;private final int DELAY_MILLIS 1000; // 延迟1秒发送消息public MusicService() {}Overridepublic IBinder onBind(Intent intent) {return binder;}public class MusicBinder extends Binder {MusicService getService() {return MusicService.this;}}private void showToast(String message) {Toast.makeText(this, message, Toast.LENGTH_SHORT).show();}Overridepublic void onCreate() {super.onCreate();mediaPlayer MediaPlayer.create(this, R.raw.music); // 加载音乐资源mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {Overridepublic void onCompletion(MediaPlayer mp) {// 音乐播放完成时的处理animator.pause(); // 停止动画tv_progress.setText(formatDuration(getTotalDuration()));showToast(音乐已完成); // 显示音乐播放完成的提示}});// 定时发送消息以更新UIRunnable runnable new Runnable() {Overridepublic void run() {if (mediaPlayer ! null mediaPlayer.isPlaying()) {int progress mediaPlayer.getCurrentPosition();int totalDuration mediaPlayer.getDuration();updateUI(progress, totalDuration);}handler.postDelayed(this, DELAY_MILLIS);}};handler.postDelayed(runnable, DELAY_MILLIS);}// 更新UI发送消息给MainActivityprivate void updateUI(int progress, int totalDuration) {if (handler ! null) {Message message Message.obtain(handler, UPDATE_UI, progress, totalDuration);handler.sendMessage(message);}}// 添加播放音乐的方法public void playMusic() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}// 添加暂停音乐的方法public void pauseMusic() {if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}// 添加继续播放音乐的方法public void continueMusic() {if (!mediaPlayer.isPlaying()) {mediaPlayer.start();}}Overridepublic void onDestroy() {if (mediaPlayer ! null) {mediaPlayer.release();mediaPlayer null;}super.onDestroy();}// 获取音乐总时长public int getTotalDuration() {return mediaPlayer.getDuration();}// 获取音乐当前播放进度public int getCurrentPosition() {return mediaPlayer.getCurrentPosition();}// 设置音乐播放进度public void seekTo(int position) {mediaPlayer.seekTo(position);}} 实现效果 最重要的是能在后台播放音乐
http://www.w-s-a.com/news/485340/

相关文章:

  • 免费建站网站一级大录像不卡在线看网页郑州网站关键
  • 做网站 然后百度推广哈尔滨建筑网
  • 章丘营销型网站建设网站测评必须做
  • 营销者网站怎么把网站黑了
  • 律师事务所手机网站校园网站设计
  • 网站案例展示分类网站响应速度优化
  • 风景网站的制作网站ip地址查询域名
  • 怎样看网站是谁做的马鞍山什么房产网站做的好
  • 西安推荐企业网站制作平台软装设计方案ppt
  • 网站静态页模板专业网站设计开发公司
  • 手机免费在线搭建网站短网址生成防红
  • 天津网站设计网站制作如何新建wordpress
  • 山东省建设备案网站审批国际新闻最新消息10条简短
  • 成都市建设网扬尘监控网站短域名转换
  • 怎么做手机网站潍坊建设银行网站
  • 做网站分什么软件品牌设计培训
  • 太原网站设计排名设计本装修效果图
  • 网站个人中心模板石家庄网站系统开发
  • 优秀的电子商务网站教育公司网站建设文案
  • 网站开发市场成本网站链接推广工具
  • 猪八戒做网站排名常州seo博客
  • wordpress 网站遭篡改如何优化公司的网站
  • 汉中公司做网站网站建设的风格设置
  • 网站建议怎么写怎么做网页连接
  • 站长工具seo综合查询下载安装软件平台搭建包括哪几个方面
  • 做网站怎么存放视频支付功能网站建设
  • 庆阳手机网站设计兰州网站的优化
  • 企业网站托管有必要吗项目管理资格证书
  • 检索类的网站建设个人博客网页模板图片
  • 贵阳网站建设搜q479185700做网站有什么语言好