Service + 音乐播放

来源:互联网 发布:淘宝运营高级教程视频 编辑:程序博客网 时间:2024/06/05 03:20

这是一个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;@Overrideprotected 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);}@Overrideprotected 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@Overridepublic IBinder onBind(Intent intent) {    return null;}//在此方法中服务被创建@Overridepublic 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的生命周期方法是唯一的可以执行多次的方法。 */@Overridepublic 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销毁时执行的方法@Overridepublic 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) 配置文件(一定要在里面注册,否则运行失败)

这里写图片描述

0 0
原创粉丝点击