一、混合方式开启服务
需求:既想让服务在后台长期运行,又想调用服务里面的方法
1.先调用 startService 方法开启服务,能保证服务在后台长期运行
2.调用 bindService 方法,获取中间人对象(IBinder)
3.调用 unbindService 解绑服务
4.调用stopService 方法停止服务
二、百度音乐盒
1.创建一个服务,写播放、暂停等几个方法
package activitytest.example.com.baidumusic;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
public class MusicService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
//【2】返回中间人对象(IBinder)
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
//播放音乐方法
public void playMusic(){
//TOOD
System.out.println("音乐播放了");
}
//音乐暂停方法
public void pauseMusic(){
//TOOD
System.out.println("音乐暂停了");
}
//继续播放方法
public void replayMusic(){
//TOOD
System.out.println("音乐继续播放了");
}
//【1】在服务内部定义一个中间人对象(IBinder)
private class MyBinder extends Binder implements Iservice{
//调用播放方法
@Override
public void callPlayMusic() {
playMusic();
}
//调用暂停方法
@Override
public void callPauseMusic() {
pauseMusic();
}
//调用继续播放方法
@Override
public void callReplayMusic() {
replayMusic();
}
}
}
2.定义一个接口,把想暴露的方法放到接口中
package activitytest.example.com.baidumusic;
public interface Iservice {
//把想暴露的方法都定义在接口中
public void callPlayMusic();
public void callPauseMusic();
public void callReplayMusic();
}
3.定义一个中间人对象(IBinder):1中代码的第【1】步
4.MainActivity中混合方式开启服务
package activitytest.example.com.baidumusic;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
Iservice iservice;//我们定义的中间人对象(IBinder)
MyConn conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//混合方式开启服务
Intent intent = new Intent(this,MusicService.class);
//【1】先调用startService 目的,保证服务可以在后台长期运行
startService(intent);
//【2】调用bindService 目的,为了获取我们定义的中间人对象(IBinder),就可以间接的调用服务里面的方法了
conn = new MyConn();
bindService(intent,conn,BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
//当Activity销毁的时候解绑服务,目的是为了不报红色日志
unbindService(conn);
super.onDestroy();
}
//点击播放音乐
public void click1(View v){
iservice.callPlayMusic();
}
//点击暂停音乐
public void click2(View v){
iservice.callPauseMusic();
}
//点击继续播放音乐
public void click3(View v){
iservice.callReplayMusic();
}
//监听服务的状态
private class MyConn implements ServiceConnection{
//当服务链接成功时调用
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//获取我们定义的中间人对象(IBinder)
iservice = (Iservice) iBinder;
}
//失去连接
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
}