6.1.2 加上MediaPlayer的本地服务
既然已经创建了一个服务示例,现在可以将它作为模板来创建应用程序,以实现在后台播放音频文件。下面是一个服务以及一个控制服务的活动,这就使我们能够在后台播放音频文件。它的工作方式与第5章中自定义的音频播放器示例类似,因为它使用Android提供的相同的底层MediaPlayer类。
1 package com.nthm.androidtestService; 2 3 import com.nthm.androidtest.R; 4 import android.app.Service; 5 import android.content.Intent; 6 import android.media.MediaPlayer; 7 import android.media.MediaPlayer.OnCompletionListener; 8 import android.os.IBinder;
该服务实现了OnCompletionListener,因此在MediaPlayer完成播放音频文件时可以得到通知。
1 public class BackgroundAudioService extends Service implements 2 OnCompletionListener {
声明一个MediaPlayer类型的对象。该对象将处理音频的播放,与第5章中自定义的音频播放器示例一样。
1 private MediaPlayer mediaPlayer; 2 @Override 3 public IBinder onBind(Intent intent) { 4 return null; 5 } 6 @Override 7 public void onCreate() { 8 super.onCreate();
在onCreate方法中实例化该MediaPlayer。把一个名为music.mp3的音频文件的具体引用传递给他,该文件应该放在项目的原始资源目录(res/raw)中。若该目录不存在,则创建它。将音频文件放在该位置,使得我们能够通过生成的R类R.raw.music中的常量来引用它。关于把音频文件放在原始资源目录中的更详细信息,可参看5.1.3节。
1 mediaPlayer=MediaPlayer.create(this, R.raw.music);
同时将当前服务(即this)设置为MediaPlayer对象的OnCompletionListener。
1 mediaPlayer.setOnCompletionListener(this); 2 }
当在该服务上发出startService命令时,将触发onStartCommand方法。由于可能多次调用该方法,因此这个方法首先将检查MediaPlayer对象是否已在播放,若没有播放,则启动它。由于使用了onStartCommand方法而非onStart方法,因此该示例仅能在Android 2.0及以上版本中运行。
1 @Override 2 public int onStartCommand(Intent intent, int flags, int startId) { 3 if(!mediaPlayer.isPlaying()){ 4 mediaPlayer.start(); 5 } 6 return START_STICKY; 7 }
当服务销毁时,触发onDestroy方法。由于这并不能确保MediaPlayer会停止播放,因此如果它还在播放,那么在这里将调用它的stop方法,同时还会调用其release方法来清除内存使用和(或)资源锁。
1 @Override 2 public void onDestroy() { 3 if(mediaPlayer.isPlaying()){ 4 mediaPlayer.stop(); 5 } 6 mediaPlayer.release(); 7 super.onDestroy(); 8 }
由于实现了OnCompletionListener,且服务本身被设置为MediaPlayer对象的OnCompletionListener,因此当MediaPlayer完成播放音频文件时,将调用如下的onCompletion方法。由于这个服务只用于播放一首歌,因此将调用stopSelf方法,其类似于在活动中调用stopService方法。
1 @Override 2 public void onCompletion(MediaPlayer mp) { 3 stopSelf(); 4 } 5 }
以下是对应上述服务的活动。它有一个非常简单的界面,使用两个按钮来控制服务的启动和停止。在每种情况下,它在后面都会直接调用finish方法,以表明该服务不依赖于活动而独立运行。
1 package com.nthm.androidtestActivity; 2 3 import com.nthm.androidtest.R; 4 import com.nthm.androidtestService.BackgroundAudioService; 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.Button; 11 12 public class BackgroundAudioActivity extends Activity implements 13 OnClickListener { 14 private Button startPlaybackButton; 15 private Button stopPlaybackButton; 16 private Intent playbackServiceIntent; 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.backgroundaudioactivity); 21 startPlaybackButton=(Button) findViewById(R.id.StartPlayerbackButton); 22 stopPlaybackButton=(Button) findViewById(R.id.StopPlayerbackButton); 23 startPlaybackButton.setOnClickListener(this); 24 stopPlaybackButton.setOnClickListener(this); 25 playbackServiceIntent=new Intent(this, BackgroundAudioService.class); 26 } 27 28 @Override 29 public void onClick(View v) { 30 if(v==startPlaybackButton){ 31 startService(playbackServiceIntent); 32 finish(); 33 }else if(v==stopPlaybackButton){ 34 stopService(playbackServiceIntent); 35 finish(); 36 } 37 } 38 }
下面是上述活动使用的backgroundaudioactivity.xml布局的XML文件。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" 4 android:orientation="vertical" 5 > 6 <TextView 7 android:text="Backgroung Audio Player" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content"></TextView> 10 <Button 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:id="@+id/StartPlayerbackButton" 14 android:text="Start Playerback"/> 15 <Button 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" 18 android:id="@+id/StopPlayerbackButton" 19 android:text="Stop Playerback"/> 20 </LinearLayout>
如上面的代码所示,在服务中仅仅使用MediaPlayer来启动和停止音频播放非常的简单。现在让我们看看如何更深入一步。
posted on 2014-08-28 15:36 宁静致远,一览众山小 阅读(403) 评论(0) 编辑 收藏 举报