Binder的使用(跨进程——AIDL,非跨进程)

Posted 技术丶从积累开始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Binder的使用(跨进程——AIDL,非跨进程)相关的知识,希望对你有一定的参考价值。

一、Binder类

1.作用:Binder是客户端与服务器端的通信的媒介(连接各种Manager的桥梁),客户端通过Binder对象获取服务器端提供的数据

(为什么要用Binder来提供数据呢,服务器不能自己传给客户端数据么?)

因为服务器端通过Binder创建接口暴露自身数据,能够防止其他黑客入侵,导致数据被偷走或者篡改,只能让其他用户获取我们想要给他们的数据,不让他们从服务器自己拿数据。

2.在服务器端创建的Binder类,其实是运行在Binder的线程池中,就是说当使用的时候是从线程池中拿取Binder使用的,当多个客户端调用的时候,需要进行线程同步。

二、跨进程使用(实现客户端添加Book对象,服务器端接收对象并打印)

步骤一:创建Book.java类、Book.aidl类、IBookManager.aidl类

详见:Android Studio中如何创建AIDL

步骤二:创建Service并重写IBookManager类

/*BookService类*/

public class BookService extends Service {
    private static final String TAG = "BookService";

    private List<Book> mBookList;
    
    //如何创建在AIDL创建的IBookManager类
    @Nullable
    private Binder mIBookManager = new IBookManager.Stub(){

        @Override
        public List<Book> getBooksItem() throws RemoteException {
            return mBookList;
        }

        @Override
        public void addBook(Book book) throws RemoteException {
            Log.d(TAG,"新书加入"+book.toString());
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        mBookList = new ArrayList<>();
        mBookList.add(new Book(1,"疯狂android讲义"));
        mBookList.add(new Book(2,"Android开发艺术探索"));
    }

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

不要忘了在AndroidManifest.xml中注册

<service android:name=".BookService" 
       android:process=":Remote">
      <!--Service创建新的进程-->
</service>

步骤三:在客户端中启动Service

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private IBookManager mService;
    private List<Book> mBookList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //必须创建ServiceConnection对象,详见Service类的使用
        ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                //将服务器的Binder转换陈客户端的Binder
                mService = IBookManager.Stub.asInterface(service);
                try {
                   //获取所有书籍
                    mBookList = mService.getBooksItem();
                    Log.d(TAG,mBookList.get(0).toString());
                   //加入书籍
                    mService.addBook(new Book(2,"ios"));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
        //启动Service
        Intent intent = new Intent(this,BookService.class);
        bindService(intent,connection,BIND_AUTO_CREATE);
    }
}    


未理解的问题:当application结束时候,Service的进程是否也会终止? 与线程的Binder的区别

三、不跨进程使用

详情见:Service(Local Service)简介

四、跨进程与不跨进程原理的区别

跨进程:onBind()获取的是所返回对象的代理

不跨进程:onBind()可以直接获取onBind方法的返回值

以上是关于Binder的使用(跨进程——AIDL,非跨进程)的主要内容,如果未能解决你的问题,请参考以下文章

Android跨进程通信Binder机制与AIDL实例

Android跨进程通信Binder机制与AIDL实例

基于binder的跨进程通讯之使用AIDL实现Demo

Android Binder,AIDL跨进程通讯详解与实现,看一遍就懂

Android 跨进程通信-从源码分析AIDL跨进程通信实现

AIDL跨进程通信