天天看点

Android-绑定服务的实现方式

##Bound service 绑定服务
           

官方文档说明bound service有三种方式:

  • 通过Binder实现
  • 通过Messenger实现
  • 通过AIDL实现

我们看一下第一种实现方式:

  1. 继承Service 并重写onBind()方法
  2. 在Service 定义内部类MyBinder 继承自Binder,实现相应的方法
  3. 在Activity绑定Service,获得service返回的binder对象

#通过绑定service获得binder的getData()方法,改变textView的值

public class MainActivity extends AppCompatActivity {

private String s;
private Button bind;
private Button unbind;
//创建ServiceConnection对象,得到返回的Binder对象
ServiceConnection connection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        ForeService.BoundBinder boundBinder=(ForeService.BoundBinder) service;
        s=boundBinder.getData();
        Log.e("TAG",s);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    bind=(Button)findViewById(R.id.bind);
    unbind=(Button)findViewById(R.id.unbind);
    final TextView textView=(TextView)findViewById(R.id.textView);
    bind.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent =new Intent(MainActivity.this,ForeService.class);
            bindService(intent,connection,BIND_AUTO_CREATE);

        }
    });
    unbind.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            unbindService(connection);
            Toast.makeText(MainActivity.this,"unbind successful",Toast.LENGTH_LONG).show();
            if (!"".equals(s))
                textView.setText(s);
        }
    });
}
}
           
public class ForeService extends Service {
@Override
public void onCreate() {
    super.onCreate();
   /* Notification notification=new Notification(R.mipmap.ic_launcher,"hello",System.currentTimeMillis());
    Intent intent=new Intent(this,MainActivity.class);
    startForeground(1,notification);*/
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    IBinder binder=new BoundBinder();
    return binder;
}


class BoundBinder extends Binder {
    public String getData(){
        String s="hello binder from bound";
        return s;
    }
}
}
           

第二种实现通过Messenger:

客户端Activity的实现,绑定service。

public class MesActivity extends Activity {
private Button start;
private Button stop;
private ServiceConnection connection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Messenger messenger=new Messenger(service);
        Message message=Message.obtain(null,1);
        Bundle bundle=new Bundle();
        bundle.putString("key","from service connection");
        message.setData(bundle);
        try{
            messenger.send(message);
        }catch (RemoteException e){
            e.printStackTrace();
        }
        Log.e("TAG","connection");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.e("TAG","disconnection");
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.messenger_layout);
    initView();
}


public void initView(){
    start=(Button)findViewById(R.id.mes_start);
    stop=(Button)findViewById(R.id.mes_stop);

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent=new Intent(MesActivity.this,MessenService.class);
            Intent intent1=new Intent();
            bindService(intent1,connection,BIND_AUTO_CREATE);
            toastInfo(MesActivity.this,"bind");
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            unbindService(connection);
            toastInfo(MesActivity.this,"unbind");
        }
    });

}


public void toastInfo(Context context,String s){
    Toast.makeText(context,s,Toast.LENGTH_LONG).show();
}

}
           

服务端service 的实现:

public class MessenService  extends Service {
private Messenger messenger;
private Handler handler=new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        if (msg.what==1){
           String s= msg.getData().getString("key");
            Log.e("Service",s);
        }
        return true;
    }
});


@Nullable
@Override
public IBinder onBind(Intent intent) {
    messenger=new Messenger(handler);
    return messenger.getBinder();
}
}
           

第三种实现方式,通过AIDL:

这是服务端代码:

首先创建AIDl文件,创建完成以后需要将工程build下,否则调用时报错。

interface INumberManager {
/**
 * Demonstrates some basic types that you can use as parameters
 * and return values in AIDL.
 */

        String getNumber();
        void addNumber(int a);
}
           

创建service文件

public class NumberManagerService extends Service {
private ArrayList<Integer> list=new ArrayList<>();
private Binder binder=new INumberManager.Stub() {
    @Override
    public String getNumber() throws RemoteException {
        return list.toString()+"";
    }

    @Override
    public void addNumber(int a) throws RemoteException {
        list.add(a);
    }
};

@Override
public void onCreate() {
    super.onCreate();
    list.add(1);
    list.add(2);
    list.add(3);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return binder;
}
}
           

这是客户端代码:

在Activity绑定服务

public class MesActivity extends Activity {
private Button start;
private Button stop;
private ServiceConnection connection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      INumberManager iNumberManager=INumberManager.Stub.asInterface(service);
        try {
            iNumberManager.addNumber(12);
            String s=iNumberManager.getNumber();
            Log.e("NUMBER",s);
        }catch (RemoteException e){

        }

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        Log.e("TAG","disconnection");
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.messenger_layout);
    initView();

}


public void initView(){
    start=(Button)findViewById(R.id.mes_start);
    stop=(Button)findViewById(R.id.mes_stop);

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent2=new Intent(MesActivity.this,BookManagerService.class)
            bindService(intent2,connection,BIND_AUTO_CREATE);
            toastInfo(MesActivity.this,"bind");
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            unbindService(connection);
            toastInfo(MesActivity.this,"unbind");
        }
    });

}


public void toastInfo(Context context,String s){
    Toast.makeText(context,s,Toast.LENGTH_LONG).show();

}
           

}