• 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方法的返回值

  • 相关阅读:
    团队冲刺第四天
    团队冲刺第三天
    团队冲刺第二天
    团队冲刺第一天
    全球疫情地图显示
    团队博客——keep running视频+PPT介绍
    周总结7
    人月神话阅读笔记03
    Java枚举类型的使用,数值的二进制表示
    四则运算器
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5352134.html
Copyright © 2020-2023  润新知