这是一个Service生命周期及开启服务的小例子,同时实现播放音乐功能。
运行结果:
直接上菜:
1) res/layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.victor.a1000phone.day23_demo2_musicplay.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择播放birds这首歌曲"
android:layout_centerHorizontal="true"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_startmusic"
android:layout_marginTop="50dp"
android:layout_centerHorizontal="true"
android:onClick="onClick"
android:text="开始音乐"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_pausemusic"
android:text="暂停音乐"
android:onClick="onClick"
android:layout_below="@id/btn_startmusic"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_stopmusic"
android:layout_below="@id/btn_pausemusic"
android:text="停止音乐"
android:onClick="onClick"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"/>
</RelativeLayout>
2) MainActivity.class
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
/**
* 这是一个Service生命周期及开启服务的小例子。
* 同时实现播放音乐功能
*/
public class MainActivity extends AppCompatActivity {
//规定开始音乐,暂停音乐和结束音乐的标志
public static final int PLAY_MUSIC = 1;
public static final int PAUSE_MUSIC = 2;
public static final int STOP_MUSIC = 3;
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver=new MyBroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.complete");
registerReceiver(receiver,intentFilter);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_startmusic:
//开始音乐,可以是重新开始,也可以是暂停之后继续播放
playingmusic(PLAY_MUSIC);
break;
case R.id.btn_pausemusic:
//暂停
playingmusic(PAUSE_MUSIC);
break;
case R.id.btn_stopmusic:
//停止
playingmusic(STOP_MUSIC);
break;
}
}
private void playingmusic(int type) {
//启动服务,播放音乐
Intent intent = new Intent(this, PlayingMusicService.class);
intent.putExtra("type",type);
startService(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
3) PlayingMusicService.class
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.annotation.Nullable;
/**
* Created by Administrator on 2016/9/22.
*/
//这是一个started service
public class PlayingMusicService extends Service {
//MediaPlayer用于播放音乐等媒体资源
private MediaPlayer mediaPlayer;
//标识判断播放歌曲到底是停止之后重新播放还是继续原来的基础上播放
private boolean isStop = true;
//onBind,返回IBinder对象,可以与Activity相交互。这是Bind Service的生命周期方法。
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
//在此方法中服务被创建
@Override
public void onCreate() {
super.onCreate();
if (mediaPlayer == null) {
//创建MediaPlayer对象
mediaPlayer = new MediaPlayer();
//为播放器添加播放完成时的监听器
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//放送广播到MainActivity
Intent intent=new Intent();
intent.setAction("com.complete");
sendBroadcast(intent);
}
});
}
}
/**
* 在此方法中,服务可以执行相关逻辑,如耗时操作等
*
* @param intent :由activity(开启Service的Context)传递给service的信息,存放在intent中
* @param flags: 规定的额外信息。
* @param startId:开启服务时如果有规定id,则传入startId
* @return 返回值规定此start service是那种类型,粘性的还是非粘性的
* <p/>
* START_STICKY:粘性的,Service遇见异常停止后重新启动,并且intent=null
* START_NOT_STICKY:非粘性,Service遇见异常停止后不会重新启动。
* START_REDELIVER_INTENT:粘性的,Service遇见一场后会重新启动,并且将Context传递的信息intent重新传递
* <p/>
* onStartCommand:注意:此Service的生命周期方法是唯一的可以执行多次的方法。
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
switch (intent.getIntExtra("type", -1)) {
case MainActivity.PLAY_MUSIC:
if (isStop) {
//重置MediaPlay(当用户点击停止后再点播放时,需要重置播放器)
mediaPlayer.reset();
//将需要播放的资源与之绑定
mediaPlayer = MediaPlayer.create(this, R.raw.one);
//开始播放
mediaPlayer.start();
//是否循环播放
mediaPlayer.setLooping(false);
isStop=false;
} else if (!isStop && !mediaPlayer.isPlaying()&&mediaPlayer!=null) {
mediaPlayer.start();
}
break;
case MainActivity.PAUSE_MUSIC:
//判断,当播放器不为空并且当前正在播放音乐时,让音乐暂停
if (mediaPlayer!=null&&mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
break;
case MainActivity.STOP_MUSIC:
if (mediaPlayer!=null){
//停止之后若要开始播放音乐,又会从头开始播放
mediaPlayer.stop();
isStop=true;
}
break;
}
return START_NOT_STICKY;
}
//Service销毁时执行的方法
@Override
public void onDestroy() {
super.onDestroy();
}
}
4) MyBroadcastReceive.class
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/**
* Created by Administrator on 2016/9/22 0022.
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,”音乐播放结束”,Toast.LENGTH_SHORT).show();
}
}
5) 配置文件(一定要在里面注册,否则运行失败)