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

一、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的区别

时间: 2024-10-10 07:19:51

Binder的使用(跨进程——AIDL,非跨进程)的相关文章

跨域和非跨域 获取iframe页面高度的方法

跨域方法: 第一步,在主页面里插入代码://假设主域名是www.aaa.com  需要插入的跨域域名为www.bbb.com <iframe src="http://www.bbb.com/index.html" width="100%" height="100%" id="iframepage" name="iframepage" onLoad="iFrameHeight()"

守护进程与非守护进程

最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止. 守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已

如何定义AIDL进行跨进程通信

当进程A要去调用进程B中的service时,并实现通信,我们通常都是通过AIDL来操作的 工程A: 首先在我们自己的包com.wzp.aidlservice中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法getService().ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.Stub的内部类,该内部类中含有AIDL文件接口的getService()方法 例如: package c

中山大学软件工程专硕考研经验(双非跨考)

我是一名双非医科大学的本科生,因为不是很喜欢这个专业,并且对计算机感兴趣(喜欢写代码hhh),最后就决定跨考计算机了. 为什么选择中大呢?说来话长,很多人可能觉得我自不量力,双非跨考还考中大,但是因为有认识的朋友在中大,而且中大离我的学校很近,各种原因,选了中大软件工程专业. 因为一方面觉得数学一英语一比较难,另一方面中大软工专硕招人比学硕多很多,所以最后就选了软工专硕(数学二英语二,政治,408) 第一年考研 第一年(2018年)考研,我是7月份才开始复习,数学真是学得头痛,一开始我真是傻了得

对Binder的浅显分析及AIDL的使用

通常情况下,作为一个android开发者不会直接接触到Binder,但Binder作为ipc机制最关键的一个环节,我们很有必要去了解他.其实在不知不觉中,大家肯定和Binder打过交道,比如我们bindService的时候,客户端会获取到一个远程服务器发送回来的Binder对象,通过操作这个对象我们可以获取服务端的数据或者执行某些服务端的操作.再比如,我么在获取各种系统服务的时候,Binder是作为serviceManager连接各种manager(windowManager.....)的桥梁.

Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法

同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源策略的限制. 跨域的情形有非常多,最常见的有Ajax跨域.Socket跨域和Canvas跨域.以下列举一些我们常见的跨域情形下.某些浏览器控制台给出的错误提示: FireFox下的提示: 已阻止交叉源请求:同源策略不同意读取***上的远程资源.能够将资源移动到同样的域名上或者启用 CORS 来解决问

Api之Cors跨域以及其他跨域方式

Web Api之Cors跨域以及其他跨域方式(三) 我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式 一.手动实现JSONP跨域 1.首先创建一个Web项目,在这里我使用一般处理程序 1 public class Demo : IHttpHandler 2 { 3 public void ProcessRequest(HttpContext context) 4 { 5 //接收参数

Web Api之Cors跨域以及其他跨域方式(三)

我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式 一.手动实现JSONP跨域 1.首先创建一个Web项目,在这里我使用一般处理程序 1 public class Demo : IHttpHandler 2 { 3 public void ProcessRequest(HttpContext context) 4 { 5 //接收参数 6 string callBack = conte

JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对 http://store.company.com/dir/page.html 同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法: 1.通过jsonp跨域[解决ajax跨域] 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的

JavaScript之Ajax-7 Ajax跨域请求(Ajax跨域概述、Ajax跨域实现)

一.Ajax跨域概述 同源策略 - 同源策略(Same origin policy)是一种约定,它是浏览器的核心也最最基本的核心.如果少了同源策略,则浏览器的正常功能可能都会收到影响.可以说Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现 - 它是由 Netscape 提出的一个著名的安全策略 - 现在所有支持 JavaScript 的浏览器都会使用这个策略 - 所谓同源策略是指,域名.协议.端口相同 域名概述 - 域名(Domain Name) 是由一串用点分隔的名字组成的In