码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2016-04-04 16:29:52      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

一、Binder类

1.作用:Binder是客户端与服务器端的通信的媒介(连接各种Manager的桥梁),客户端通过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的区别

 

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

标签:

原文地址:http://www.cnblogs.com/rookiechen/p/5352134.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!