Android通过startService播放背景音乐

Android通过startService播放背景音乐,第1张

概述关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。

关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。

本文通过播放背景音乐的简单示例,演示startService的基本使用流程,具体内容如下

系统界面如下:

界面上面就两个按钮,”播放音乐并退出Activity” 和 “停止播放音乐”。我们在该示例中,通过 *** 纵Activity的按钮控制MusicService播放或停止播放音乐。

我将一个名为music.mp3的放到资源目录/res/raw文件夹下面,这样我们在程序中就可以通过R.raw.music引用该音乐文件,放入/res/raw文件夹中的资源文件会保持原来的面貌不会被编译成二进制。

MusicService是用于播放背景音乐的Service,其代码如下所示:

package com.ispring.startservicedemo;import androID.app.Service;import androID.content.Intent;import androID.media.MediaPlayer;import androID.os.IBinder;import androID.Widget.Toast;import java.io.IOException;public class MusicService extends Service {  private MediaPlayer mediaPlayer = null;  private boolean isReady = false;  @OverrIDe  public voID onCreate() {    //onCreate在Service的生命周期中只会调用一次    super.onCreate();    //初始化媒体播放器    mediaPlayer = MediaPlayer.create(this,R.raw.music);    if(mediaPlayer == null){      return;    }    mediaPlayer.stop();    mediaPlayer.setonErrorListener(new MediaPlayer.OnErrorListener() {      @OverrIDe      public boolean onError(MediaPlayer mp,int what,int extra) {        mp.release();        stopSelf();        return false;      }    });    try{      mediaPlayer.prepare();      isReady = true;    } catch (IOException e) {      e.printstacktrace();      isReady = false;    }    if(isReady){      //将背景音乐设置为循环播放      mediaPlayer.setLooPing(true);    }  }  @OverrIDe  public int onStartCommand(Intent intent,int flags,int startID) {    //每次调用Context的startService都会触发onStartCommand回调方法    //所以onStartCommand在Service的生命周期中可能会被调用多次    if(isReady && !mediaPlayer.isPlaying()){      //播放背景音乐      mediaPlayer.start();      Toast.makeText(this,"开始播放背景音乐",Toast.LENGTH_LONG).show();    }    return START_STICKY;  }  @OverrIDe  public IBinder onBind(Intent intent) {    //该Service中不支持bindService方法,所以此处直接返回null    return null;  }  @OverrIDe  public voID onDestroy() {    //当调用Context的stopService或Service内部执行stopSelf方法时就会触发onDestroy回调方法    super.onDestroy();    if(mediaPlayer != null){      if(mediaPlayer.isPlaying()){        //停止播放音乐        mediaPlayer.stop();      }      //释放媒体播放器资源      mediaPlayer.release();      Toast.makeText(this,"停止播放背景音乐",Toast.LENGTH_LONG).show();    }  }}

MusicActivity的代码如下所示:

package com.ispring.startservicedemo;import androID.app.Activity;import androID.content.Intent;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.Widget.button;public class MusicActivity extends Activity implements button.OnClickListener {  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_music);  }  @OverrIDe  public voID onClick(VIEw v) {    if(v.getID() == R.ID.btnStart){      //播放背景音乐      Intent intent = new Intent(this,MusicService.class);      startService(intent);      //退出当前Activity      this.finish();    }else if(v.getID() == R.ID.btnStop){      //停止播放音乐      Intent intent = new Intent(this,MusicService.class);      stopService(intent);    }  }}

当我们单击了按钮”播放音乐并退出Activity”之后,我们首先通过Activity的startService启动MusicService,然后我们立即调用了Activity的finish方法销毁了当前的Activity。可能大家会问为什么要销毁当前的Activity?我们此处之所以调用Activity的finish方法不是从功能的角度出发的,而是从理解代码运行的角度故意这么写的: 执行完Activity的finish方法之后,当前的Activity就销毁了, 在界面上看起来就是当前UI消失了,应用程序退出了,但稍等片刻你会听到背景音乐响起。这从侧面印证了Service的一个特性: Service与Activity等一样,也是一种基本的应用程序组件,Service无需依赖任何的Activity便可独自在没有任何UI界面的情况下悠闲地在AndroID后台默默运行。

调用了startService之后,AndroID Framework接收到了intent信息,第一次会先创建MusicService的实例,执行MusicService的onCreate回调方法,onCreate在Service的生命周期中只会调用一次,我们在其onCreate方法中将R.raw.music初始化为媒体播放器,并调用媒体播放器的prepare方法。然后我们将播放器设置为循环播放状态。需要注意的是,在实际生产环境中,我们应该注册播放器的setonPreparedListener并调用prepareAsync()方法,为了简化代码起见,我们只调用了播放器的同步方法prepare()。

调用了onCreate方法后,AndroID会自动回调其onStartCommand方法,其实每次调用Context的startService都会触发onStartCommand回调方法,所以onStartCommand在Service的生命周期中可能会被调用多次。所以我们在MusicService的onStartCommand中做了判断,判断播放器是否是在播放中,如果当前播放器没有播放我们才调用播放器的start方法播放背景音乐。

当我们单击了按钮”播放音乐并退出Activity”之后,MusicService启动起来,播放背景音乐,但是Activity却销毁了,程序的UI界面不见了。为了能够停止播放背景音乐,我们需要再次单击应用程序图标,重新打开MusicActivity,然后单击界面上的”停止播放音乐”按钮,此时我们会调用Activity的stopService方法,AndroID Framework接收到要停止服务的intent之后会回调MusicService的onDestroy方法,在该方法中我们停止播放音乐并释放媒体播放器资源。

本文只是通过播放背景音乐这一简单示例演示通过startService启动Service基本使用流程,代码没有进行优化,希望对大家学习Service有所帮助。

总结

以上是内存溢出为你收集整理的Android通过startService播放背景音乐全部内容,希望文章能够帮你解决Android通过startService播放背景音乐所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1142216.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存