美文网首页
记录一个不适用aidl代码的binder通信解决方案

记录一个不适用aidl代码的binder通信解决方案

作者: 代瑶 | 来源:发表于2021-12-07 11:21 被阅读0次

implementation 'com.jeremyliao:interface-loader:0.0.1'
implementation 'com.jeremyliao:service-fetcher-rxjava2:0.0.1'

https://github.com/JeremyLiao/InterfaceLoader

服务端包名 com.daiyao.test

image.png image.png

ILoaderDemo.java

package sh.qiyi.posterboard.binder;

public interface ILoaderDemo {

    int plus(int a, int b);

    int minus(int a, int b);

    int multi(int a, int b);
}

ILoaderDemoService.java


public class LoaderDemoService extends Service {

    public static final String ACTION = "intent.action.loader";


    @Override
    public void onCreate() {
        super.onCreate();
        XLog.d("onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        XLog.d("onBind");
        return InterfaceService.newService(ILoaderDemo.class, new ILoaderDemo() {
            @Override
            public int plus(int a, int b) {
                return a + b;
            }

            @Override
            public int minus(int a, int b) {
                return a - b;
            }

            @Override
            public int multi(int a, int b) {
                return a * b;
            }
        });
    }
}

在MainActivity 或者 Application里面initBinderService

 private void initBinderService() { 
        Intent intent = new Intent(AppConstant.binderServiceName);
        intent.setPackage(getPackageName());
        ServiceFetcher serviceFetcher = new ServiceFetcher(this, intent);
        serviceFetcher.bindService();
    }





客户端包名 com.daiyao.client

新建一个com.daiyao.test的包名, 跟服务端ILoaderDemo包名一致!! 然后将ILoaderDemo文件拷贝过来

                Intent intent = new Intent("intent.action.loader");
                intent.setPackage("com.daiyao.test");
                ServiceFetcher serviceFetcher = new ServiceFetcher(TestActivity.this, intent);

                disposable.add(serviceFetcher.getService()
                        .map(new Function<IBinder, Integer>() {
                            @Override
                            public Integer apply(@NonNull IBinder binder) throws Exception {
                                return InterfaceLoader.getService(ILoaderDemo.class, binder)
                                        .plus(10, 20);
                            }
                        })
                        .map(new Function<Integer, String>() {
                            @Override
                            public String apply(@NonNull Integer result) throws Exception {
                                return "result: " + result;
                            }
                        })
                        .subscribe(new Consumer<String>() {
                            @Override
                            public void accept(String result) throws Exception {
                                mockBinderConnect.setText(result);
                            }
                        }));

相关文章

网友评论

      本文标题:记录一个不适用aidl代码的binder通信解决方案

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