绑定服务
绑定服务提供了一个客户端–服务器接口,允许组件与服务进行交互、发送、请求、获取结果、甚至是利用进程间通信(IPC)跨进程执行这些操作,仅当与另一个应用程序绑定时,绑定服务才会执行,多个组件可以同时绑定服务,但全部取消绑定服务后,该服务即会被销毁。
接下来,我们创建一个简单的关于绑定服务的案例,可以更好的理解绑定服务。
首先我们创建一个安卓项目,在这里我就不介绍如何创建了。
在xml中编写如下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

  <Button
      android:id="@+id/button"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="获取随机数"
      android:onClick="click"
      />
    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"

        />

</LinearLayout>

然后使用安卓自带的创建服务,步骤如下:

Android 绑定外部服务 安卓绑定服务_绑定服务


然后创建一个名字叫MyService的服务,在MyService中的代码如下:

public class MyService extends Service {
   private final IBinder binder=new IBinder();
   private final Random random=new Random();

   public class IBinder extends Binder{
       MyService getService(){
           return MyService.this;
       }
   }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
       return binder;
    }
    public int getRandom(){
       return random.nextInt(100);
    }
}

接下来关于上面的进行分析:
自定义一个Binder的子列IBinder,这个类对于绑定时服务的内容实现来说非常重要,IBinder类可以理解为一个服务和前台Activity的通道。可以在自定义的Binder子类中结合实际添加一些功能方法。而后将onBind(Intent intent)函数的返回值改为自定义IBinder 子类的一个实例。在自定义的服务类中,可以自定义一些方法(本文中为 getRandom)便于前台调用。

IBinder是远程对象的接口。在这里是表示客户端与服务交互的程序接口。
Binder相当于一种托管,可以说是中转站,用于配置不同的Service服务。
然后在Java中编写代码如下:

public class MainActivity extends AppCompatActivity {
    boolean bound=false;
    MyService myService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=(Button)findViewById(R.id.bottom);
        final TextView textView=(TextView)findViewById(R.id.textView);

    }
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.IBinder binder=(MyService.IBinder) service;
            myService=binder.getService();//获取Service实例
            bound=true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            bound=false;
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent=new Intent(MainActivity.this,MyService.class);
        bindService(intent,connection,BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (bound){
            unbindService(connection);
            bound=false;
        }
    }
    public void click(View v){
        int num=myService.getRandom();
        TextView textView=(TextView)findViewById(R.id.textView);
        textView.setText("获取的随机数为:"+num);
    }
}

客户端通过bindService()方法绑定到服务时,客户端必须提供ServiceConnection接口的实现类,它监视客户端与服务器之间的连接。bindService()方法立即返回,但是当Android系统创建客户端与服务之间的连接时,它调用ServiceConnection接口的onServiceConnected()方法,来发送哭护短用来与服务通信的IBinder对象。

通俗的来将ServiceConnection类是实现前端Activity和服务交互功能的关键,里面定义了前台需要调用那些服务端的功能。

基本的绑定服务就以完成。

运行时出来的效果,当点击按钮会出来获取的随机数:

Android 绑定外部服务 安卓绑定服务_android_02