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类
步骤二:创建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的区别
三、不跨进程使用
四、跨进程与不跨进程原理的区别
跨进程:onBind()获取的是所返回对象的代理
不跨进程:onBind()可以直接获取onBind方法的返回值
以上是关于Binder的使用(跨进程——AIDL,非跨进程)的主要内容,如果未能解决你的问题,请参考以下文章
Android Binder,AIDL跨进程通讯详解与实现,看一遍就懂