进程间的对话——aidl(三)

  之前记录了一个客户端如何跨进程地与一个服务端通信。如果只有一个客户端需要它,那么跨进程的意义也显得不那么大了。所以,我在此再建立了一个客端共同使用这个服务端。

  客户端的代码与之前的代码几乎一模一样。在此不贴代码了。唯一不同的是,文件结构不同。由于服务端写在之前的工程中,我们需要一套共同的aidl接口,和Book.java。不仅代码相同,包名也要完全相同。所以,建议直接从服务端的那里复制文件。

这样,我们即可以保证这个客户端与服务端正常通信。

说到这里,我不免产生了疑问。我的这个服务端是否太公开了。任何一个客户端,不管是不是我的客户端,只要造出这个接口和包结构,然后知道我Service的Action都可以与我通信。这不科学!

经查阅,比较通用的有两种方式,对这一通信进行权限管理。

我们着重记录其中一种,即onBind验证。

首先,我们在服务端的AndroidManifest里面进行配置。

    <permission
        android:name="com.dream.fishbonelsy.aidldemo.permission.ACCESS"
        android:protectionLevel="normal"/>

这个配置即是设定一个口令,口令可以自定。

这里值得注意的是,服务端的process必须设为remote,不能设为任意进程名。一旦设为任意进程名,这里就不受权限的控制了。

        <service
            android:name=".service.BookManagerService"
            android:process=":remote"
            >
            <intent-filter>
                <action android:name="com.dream.fishbonelsy.aidldemo.service"/>
            </intent-filter>
        </service>

完成了配置,我们再来修改服务端的少量代码。

    @Override
    public IBinder onBind(Intent intent) {
        int check = checkCallingOrSelfPermission("com.dream.fishbonelsy.aidldemo.permission.ACCESS");
        if (check == PackageManager.PERMISSION_DENIED){
            return null;
        }
        return mBinder;
    }

将Service中的onBind方法,修改成这样,在返回IBinder之前,做一次判断。如果没有权限则返回空。

无论哪个客户端,想要与这个服务端通信时,只需要在自己的AndroidManifest中加上

    <uses-permission android:name="com.dream.fishbonelsy.aidldemo.permission.ACCESS"/>

即可。

这样,一个基本的跨进程,C/S模型算是完成了。但是还有很多坑在其中,下回再探究。

Done ~

时间: 2024-10-13 16:44:34

进程间的对话——aidl(三)的相关文章

android 不同进程间的调用 AIDL 实现通讯服务

android 不同进程间的调用  AIDL 实现通讯服务 最近对aidl android 不同进程间的调用,不同运用间的调用做了一些尝试: 步骤如下: 1:首先在要被调用的程序里写好服务service 具体代码如下: package com.jiaruihua.service.demo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.I

Android初级教程进程间的通信AIDL

在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activity中控制服务的这两个方法,通过点击按钮的方式实现停止与播放音乐. 对同一个程序服务与活动交互的方式,先给出一张图片: 给出代码(案例为模拟音乐播放器): 一.定义一个服务类MusicService: package com.ydl.music; import android.app.Service

进程间实现数据共享的三种方式

1.Queue: -linux: q = multiprocessing.Queue() def task(arg,q): q.put(arg) def run(): for i in range(10): p = multiprocessing.Process(target=task, args=(i, q,)) p.start() while True: v = q.get() print(v) run() -windows: import multiprocessing def task(

进程间通讯aidl

进程间通讯(aidl) 1.首先定义一个接口 2.把这个接口的文件扩展名改为xxx.aidl 3.写一个MyService类继承自Service类重新里面的方法, 4.在MyService类定义一个内部类继承自Stub类 5.在onBind()方法把内部类的一个实例作为返回值同外部访问 6.在MainActivity中通过bindService(intent,ServiceConnection,flag)方法中的第二个参数他是一个接口,要一个类继承或者通过匿名对象作为参数 它里面有两个方法onS

Linux 进程间通讯详解一

进程间的通讯 两台主机间的进程通讯 --socket 一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量,System V共享内存 --socket 进程间共享内存的三种方式 --文件系统(通过系统调用读写磁盘文件,scoket)==>最慢 --Linux内核共享信息(直接在Linux内核中1进行通讯,比如管道,消息队列,信号)==>中等 --共享内存区(在自己进程内开辟一块内存,映射到系统内存)=

进程间的通信——pipe通信

进程间的通信分为三种  信号通信,管道通信.socket通信 当进程创建管道文件后,其建立的子进程自动继承该文件. 管道通信分为命名管道和未命名管道,他们的区别是命名管道在当创建他的进程结束后,系统仍存有该文件 管道的命令格式为 pipe(fds) 其中 fds定义为fds[2] fds[0]为读文件描述符,1为写文件描述符 原文地址:https://www.cnblogs.com/jiangxue2019/p/11965592.html

Android进阶笔记04:Android进程间通讯之Messenger ( 区别于AIDL)

一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消息的进程间通信,就像子线程和UI线程发送消息那样,是不是很简单,还不用去写AIDL文件,是不是有点小爽.哈哈.此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信:甚至作为一个转接处,任意两个进程都能通过服务端进行通信. (2) Messenger 与 AIDL 比较:    

Android 使用AIDL实现进程间的通信

在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可,通过这种方式我们就可以完成进程间的通信工作.关于AIDL的编写规则我在这里就不多介绍了,读者可以到网上查找一下相关资料. 接下来,我就演示一个操作AIDL的最基本的流程. 首先,我

Android Studio创建AIDL文件并实现进程间通讯

在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.