package com.example.servicefyy; 主界面的程序代码哦! import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.SeekBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { private SeekBar mSb; private TextView mTv; private boolean isStop; MyService.MyBinder mBinder; private Handler mHander = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (isStop){ return; } mSb.setMax(mBinder.getDuration()); mSb.setProgress(mBinder.getCurrentPos()); mHander.sendEmptyMessageDelayed(111, 1200); } }; private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (MyService.MyBinder) service;//serivce和Activity的通信哦 mHander.sendEmptyMessage(111); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSb = (SeekBar) findViewById(R.id.sb); mTv = (TextView) findViewById(R.id.tv); mSb.setOnSeekBarChangeListener(this); Intent intent = new Intent(this, MyService.class); this.bindService(intent, conn, BIND_AUTO_CREATE); } public void go1(View view) { isStop = false; mHander.sendEmptyMessage(111);//停止后的重新开始,需要发送消息,提示界面的更新哦哦! Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_PLAYER); startService(intent); } public void go2(View view) { isStop = true; Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_STOP); startService(intent); } public void go3(View view) { Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_PAUSE); startService(intent); } public void go4(View view) { Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_RESUME); startService(intent); } public void go5(View view) { Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_KJIN); startService(intent); } public void go6(View view) { Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_KTUI); startService(intent); } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) {//手动拖动哦 if (isStop) { return; } Intent intent = new Intent(this, MyService.class); intent.putExtra("command", MyService.COMMAND_XJD); intent.putExtra("jd", progress); startService(intent); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override protected void onDestroy() { super.onDestroy(); //解绑定哦哦哦! this.unbindService(conn); } }
服务中的程序哦哦哦哦!
package com.example.servicefyy; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.net.Uri; import android.os.Binder; import android.os.Environment; import android.os.IBinder; import android.widget.Toast; import java.io.IOException; public class MyService extends Service implements MediaPlayer.OnPreparedListener { //主线程终止,子线程不会终止的哦哦! private MediaPlayer mMediaPlayer;//内部封装有子线程进行音乐播放哦! private String musicPath; private boolean isStop;//判断是否停止哦! private boolean isPrepare;//判断是否准备哦! // private MyThread mMyThread; public static final String COMMAND_PLAYER = "player"; public static final String COMMAND_STOP = "stop"; public static final String COMMAND_PAUSE = "pause"; public static final String COMMAND_RESUME = "resume"; public static final String COMMAND_KJIN = "kjin"; public static final String COMMAND_KTUI = "ktui"; public static final String COMMAND_XJD = "jd"; public MyService() { } @Override public void onCreate() { super.onCreate(); getMedia(); } void getMedia() { mMediaPlayer = new MediaPlayer();//声明实例化MediaPlayer哦! musicPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/love.mp3"; try {//获取本地文件的路径哦哦! mMediaPlayer.setDataSource(this, Uri.parse(musicPath)); } catch (IOException e) { e.printStackTrace(); } } @Override public int onStartCommand(Intent intent, int flags, int startId) { String command = intent.getStringExtra("command"); if (command == null) { return super.onStartCommand(intent, flags, startId); } switch (command) { case COMMAND_PLAYER: doPlay(); break; case COMMAND_STOP: doStop(); break; case COMMAND_PAUSE: doPause(); break; case COMMAND_RESUME: doResume(); break; case COMMAND_KJIN: doKin(); break; case COMMAND_KTUI: doKTui(); break; case COMMAND_XJD: doXJD(intent.getIntExtra("jd", 0)); break; } return super.onStartCommand(intent, flags, startId); } private void doXJD(int prigrass) { mMediaPlayer.seekTo(prigrass); } private void doKTui() { Toast.makeText(this, "快退", Toast.LENGTH_SHORT).show(); mMediaPlayer.seekTo(mMediaPlayer.getCurrentPosition() - 5000); } private void doKin() { Toast.makeText(this, "快进", Toast.LENGTH_SHORT).show(); mMediaPlayer.seekTo(mMediaPlayer.getCurrentPosition() + 5000); } private void doResume() { Toast.makeText(this, "继续", Toast.LENGTH_SHORT).show(); mMediaPlayer.start(); } private void doPause() { Toast.makeText(this, "暂停", Toast.LENGTH_SHORT).show(); // mMediaPlayer.stop(); mMediaPlayer.pause(); } private void doStop() { Toast.makeText(this, "停止", Toast.LENGTH_SHORT).show(); isStop = true; isPrepare = false; //停止播放,并释放资源哦哦! //完全释放mMediaPlayer资源--等同于销毁哦!需要重新构造资源才能播放哦! mMediaPlayer.stop(); mMediaPlayer.release(); } private void doPlay() { Toast.makeText(this, "开始", Toast.LENGTH_SHORT).show(); if (isStop) { getMedia();//release后,需要重新构造资源哦! } if (!isPrepare) { //通常异步处理(子线程)都会有一个回调的结果! mMediaPlayer.prepareAsync();//要播放,先准备哦!--开启子线程哦!准备是耗时的操作哦 mMediaPlayer.setOnPreparedListener(this); } } @Override public void onPrepared(MediaPlayer mp) { // mSb.setProgress(mMediaPlayer.getDuration());//获取最大进度哦哦! // if (mMyThread == null || !mMyThread.isAlive()) { // mMyThread = new MyThread();//为确保子线程只能start一次的机制的进行哦! // mMyThread.start(); // } //准备好,在开始哦哦! mMediaPlayer.start(); isPrepare = true; isStop = false; } @Override public IBinder onBind(Intent intent) { return new MyBinder(); } public class MyBinder extends Binder { public int getCurrentPos() { if (!isPrepare) { return 0; } return mMediaPlayer.getCurrentPosition();//返回当前的进度哦哦! } public int getDuration() { if (!isPrepare) { return 100; } return mMediaPlayer.getDuration();//返回总时长哦! } } }