美文网首页
相同进程中通过Binder实现服务端和客户端通信

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

作者: 付凯强 | 来源:发表于2019-09-15 22:39 被阅读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 方面的文章,欢迎关注!

    相关文章

      网友评论

          本文标题:相同进程中通过Binder实现服务端和客户端通信

          本文链接:https://www.haomeiwen.com/subject/svbtuctx.html