绑定服务抽取接口

示例代码 简易的播放器:

A. 写一个接口,在接口中写一个要暴露出去的方法

B. 让服务里的内部类实现这个接口

C. activity的连接成功后,强转为接口类型

D. 调用接口中的方法,实际上调用的时接口的实现类服务里的内部类里的方法

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
public class MusicService extends Service {
   private MediaPlayer   mediaPlayer;
   @Override
   public IBinder onBind(Intent intent) {
      return new Music();
   }
   private class Music extends Binder implements IMusicService{
      @Override
      public void play() {
         playMusic();
      }
      @Override
      public void pause() {
         pauseMusic();
      }
      @Override
      public void stop() {
         stopMusic();
      }
      @Override
      public void resume() {
         resumeMusic();
      }
   }

   public void playMusic(){
      //避免音乐二重唱
      if (mediaPlayer != null) {
         mediaPlayer.stop();
         mediaPlayer.release();//释放音乐
         mediaPlayer = null;
      }
      //创建音乐对象
      mediaPlayer = MediaPlayer.create(this, R.raw.ib);
      //开启播放
      mediaPlayer.start();
   }
   public void stopMusic() {
      if (mediaPlayer != null && mediaPlayer.isPlaying()) {
         mediaPlayer.stop();
      }
   }
   public void resumeMusic() {
      if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
         mediaPlayer.start();
      }
   }
   public void pauseMusic(){
      if (mediaPlayer != null && mediaPlayer.isPlaying()) {
         mediaPlayer.pause();
     }
   }

/**
 * 音乐服务的接口
 * 暴露播放 、暂停、停止、继续播放的功能
 */
public interface IMusicService {
   /**
    * 播放音乐
    */
   public void play();
   public void pause();
   public void stop();
   public void resume();
}

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;



public class MainActivity extends Activity {
   private Intent     intent;
   private MusicCon   mConn;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      // start开启服务,让服务长期运行在后台
      intent = new Intent(this, MusicService.class);
      startService(intent);
      // bind绑定服务,调用服务里的方法
      mConn = new MusicCon();
      bindService(intent, mConn, BIND_AUTO_CREATE);
   }
   /**
    * 播放音乐
    */
   public void start(View v) {
      mService.play();
   }
   /**
    * 暂停音乐
    */
   public void pause(View v) {
      mService.pause();
   }

   /**
    * 停止播放
    */
   public void stop(View v) {
     mService.stop();
   }

   /**
    * 继续播放音乐
    */
   public void resume(View v) {
      mService.resume();
   }
   private IMusicService mService;
   /**
    * 音乐的连接对象
    */
   private class MusicCon implements ServiceConnection {
     @Override
      public void onServiceDisconnected(ComponentName name) {
      }
      @Override
      public void onServiceConnected(ComponentName name, IBinder service) {
         mService = (IMusicService) service;
      }
   }
  /**
    * 在activity销毁前解绑服务
    */
   @Override
   protected void onDestroy() {
     super.onDestroy();
      unbindService(mConn);
   }
}

清单文件注册服务:
      <service android:name="com.example.dugu_music.MusicService" ></service>

 

posted on 2017-02-19 17:01  LoaderMan  阅读(343)  评论(0编辑  收藏  举报

导航