相同进程中通过Binder实现服务端和客户端通信

2019-09-15  本文已影响0人  付凯强

0. 序言

服务端在这里可以简单的理解为Service,客户端在这里可以简单的理解为Activity。
时刻要有这个意识:Android是建立在Linux内核的基础上的,资源的分配是根据进程进行的。
这里先简单的讲解下通过Binder,相同进程Activity如何与Service进行通信。

1. 服务端

这里创建AidlService作为服务端,时刻监听客户端的请求。

public class AidlService extends Service {
    
    @Override
    public IBinder onBind(Intent intent) {
        return new AidlBinder();
    }

    public class AidlBinder extends Binder{
        public int plus(int first,int second){
            return first + second;
        }
    }

}
  1. 定义名为AidlService的Service,继承Service,实现onBind方法
  2. 定义一个内部类,名为AidlBinder,继承Binder,并在AidlBinder内部类中创建一个名为plus的方法,参数是两个int的值,返回两个参数的和。
  3. 通过plus方法可以实现AidlService和Activity的通信。
  4. onBind方法中返回名为AidlBinder的Binder对象即可。

2.客户端

定义名为MainActivity的Activity作为客户端

public class MainActivity extends AppCompatActivity {

    private AidlService.AidlBinder mAidlBinder;
    private static final String TAG = "MainActivity";

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mAidlBinder = (AidlService.AidlBinder) iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mAidlBinder = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final EditText first_num = findViewById(R.id.ed_firtst);
        final EditText second_num = findViewById(R.id.ed_second);

        Intent bindService = new Intent(MainActivity.this, AidlService.class);
        bindService(bindService, mServiceConnection, BIND_AUTO_CREATE);

        findViewById(R.id.bt_plus).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int first = Integer.parseInt(first_num.getText().toString());
                int second = Integer.parseInt(second_num.getText().toString());
                Log.d(TAG, "onClick: plus: " + mAidlBinder.plus(first, second));
            }
        });
    }
}
2019-09-15 21:44:49.654 21151-21151/com.example.testaidl D/MainActivity: onClick: plus: 11
  1. 定义了两个EditText和一个Button控件。输入两个数字在EditText中,点击Button进行求和操作,也就是在服务端中进行求和的操作。
  2. 为了实现Activity和Service的通信,我们创建ServiceConnection对象,onServiceConnected是客户端和服务端建立连接时的回调方法,onServiceDisconnected是客户端与服务端连接断开的时候的回调方法。
  3. onServiceConnected回调方法的第二个参数iBinder即是服务端中onBinder方法中返回的Binder对象,这里只需要强转即可。
  4. 有了客户端和服务端连接成功和断开连接的回调方法还不够,还需要客户端主动与服务端进行绑定,建立连接,这里只需要进行bindService即可,bindService的第一个参数是需要绑定的Service,第二个参数是ServiceConnection对象,用来监听客户端与服务端的连接的建立和断开,第三个参数的意思是客户端绑定服务端之后,服务端自动实例化Service。
  5. 当点击Button控件时,调用mAidlBinder的plus方法并传入参数即可。
  6. 即客户端Activity与服务端Service进行通信,可以通过Binder,这里Binder相当于一个代理对象,通过它就可以实现客户端与服务端的通信。

3. 后续

如果大家喜欢这篇文章,欢迎点赞!
如果想看更多 IPC 方面的文章,欢迎关注!

上一篇下一篇

猜你喜欢

热点阅读