关于Bound Services的常用方式

利用服务播放音乐的实例,大部分采用SDK上的方式,

MainActivity:

package com.example.androidtest;
import com.example.androidtest.myService.LocalBinder;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
    protected myService mService;//用于保存sevice所返回的myService对象,以调用Service中所提供的方法
    protected boolean mBound;//用于判断绑定情况
    private ServiceConnection mConnection = new ServiceConnection() {//作为bindService参数,在绑定后将调用 onServiceConnected,并接受到返回的IBinder对象,该对象可用于获取service所要提供的数据,本例中由于在服务中的LocalBinder添加了getService方法,故可用于获取myService对象
        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
        @Override
        public void onServiceDisconnected(ComponentName arg0) {//在unbindService后调用,用作清理资源
            mBound = false;
            mService.stopMusic();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindService(new Intent(this, myService.class), mConnection,
                Context.BIND_AUTO_CREATE);//绑定服务
        Button startButton = (Button) findViewById(R.id.button1);
        Button pauseButton = (Button) findViewById(R.id.button2);
        Button stopButton = (Button) findViewById(R.id.button3);
        startButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mService.playMusic();
                // TODO Auto-generated method stub
            }
        });
        pauseButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mService.pauseMusic();
                // TODO Auto-generated method stub
            }
        });
        stopButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mService.stopMusic();
            }
        });
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (mBound == true) {
            unbindService(mConnection);//解除绑定
        }
    }
}

myService:

package com.example.androidtest;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class myService extends Service {
    private  LocalBinder localBinder=new LocalBinder();;
    private  MediaPlayer mediaPlayer;//创建一个以raw/music为播放文件的MediaPlayer对象,可用于播放音乐
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        mediaPlayer=MediaPlayer.create(myService.this,R.raw.music);
        return  localBinder;
    }
    //创建内部类作为onBind返回值,用于给客户端获取服务端的载体
    public class LocalBinder extends Binder {
        myService getService() {//直接返回myService对象,个人认为此种方法比较简单,也可在此创建其他需要返回给客户端的方法,用于通信
            return myService.this;
        }
    }
    //客户端可调用方法:
    public void playMusic() {
        mediaPlayer.start();
    }
    public void pauseMusic() {
        mediaPlayer.pause();
    }
    public void stopMusic(){
        mediaPlayer.stop();
    }
}


你可能感兴趣的:(import)