精华内容
下载资源
问答
  • 安卓多进程通信初探

    2017-12-21 07:12:52
    android中四大组件增加android:process属性即可开启多进程。 “:”的含义是指在当前的进程名前面附加上当前的包名,并且以“:”的进程属于当前应用的私有进程,其他应用组件不可以和它跑在同一个进程中。不以“:”...

    安卓开启多线程方式

    android中四大组件增加android:process属性即可开启多进程。

    “:”的含义是指在当前的进程名前面附加上当前的包名,并且以“:”的进程属于当前应用的私有进程,其他应用组件不可以和它跑在同一个进程中。不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式和它跑在同一进程中。

    AIDL通信分析

    主要实现思路

    客户端:

    绑定服务器

    服务端:

    完成AIDL接口工作

    根据一个小demo分析

    • 服务端

    build 服务端项目以后gen目录下会生成IBookManager.java文件。 复制到客户端去。

    • 客户端

    客户端将一本bookName为“xiaofang”的书发送服务端以后获得bookName为“xiaoxiao”的书

    DESCRIPTOR

    binder的唯一标识

    asBInder

    返回Binder对象

    asInterface(android.os.IBinder obj)

    将服务器的Binder转换成客户端的所需要的AIDL接口对象,这种转换过程是区进程的,如果客户端和服务端处于同一进程,返回的是Sub对象,否则返回的Sub.Proxy的对象

    onTransact

    运行于服务端中的Binder线程池中,客户端发起的跨进程处理通过系统底层封装后由该方法处理;如果返回false,客户端请求会失败。

    ps:感谢任玉刚的艺术探索书籍,动手实践得到的知识积累

    展开全文
  • 安卓多进程通信主要有四大方案:1,Activity 2,Broadcast Receiver 3,Content Prodiver 4,Service 1,Activity Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL)...

    安卓多进程通信主要有四大方案:1,Activity 2,Broadcast Receiver 3,Content Prodiver 4,Service

    1,Activity

    Intent intent = new Intent();

    intent.setAction(Intent.ACTION_CALL);

    intent.setData(Uri.parse("tel:18702531326"));

    startActivity(intent);

    打电话的权限uses-permission android:name="android.permission.CALL_PHONE"/

    当前应用和手机本身的打电话模块是两个进程,通过设置Action和传递数据给系统打电话模块就可以将电话号码跨进程传递

    2,Broadcast Receiver

    这个更好理解了,广播分标准和有序,即异步和同步,每个订阅了广播的接受者的能收到数据(没有被拦截),但这个方式是被动的,它们无法交互,对于绝大多数的业务需求来说都需要请求网络数据并计算返回

    3,Content Prodiver

    内容提供者,安卓四大组件之一,在应用A中新建一个SharedPreferences并写入数据设置权限为Context.MODE_WORLD_READABLE,这样应用B通过A的包名和Key就可以访问这个数据,但是官方已不太建议使用这种方式,它不是进程安全的。

    4,Service

    Aidl目前来说是多进程普遍运用的技术,那么下面看一下通过Aidl怎么实现进程通信

    进程通信肯定有传输数据和接受并返还数据,先新建两个项目,一个为AidlDemo1作为Service,另一个为AidlDemo2作为Client

    先把Service项目切换到Android模式下,然后再新建aidl文件夹


    新建aidl文件夹
    在aidl文件夹下新建包名
    新建aidl文件
    切记后缀名 .aidl

    Aidl源码如下


    编写供Client项目调用的Service

    把aidl匿名实现类赋值给iBinder

    把Service项目中的aidl文件拷贝到Client项目,切记包名和文件名必须一致,然后再同步项目

    private IMyAidlInterface iMyAidlInterface;

    private ServiceConnectionconn=newServiceConnection() {

    @Override

    //当Service绑定并连接成功后调用,此时的service参数是Service项目返回的aidl实现

    public void onServiceConnected(ComponentName name,IBinder service) {

    iMyAidlInterface= IMyAidlInterface.Stub.asInterface(service);

    }

    @Override

    //断链时清空,节约内存

    public void onServiceDisconnected(ComponentName name) {

    iMyAidlInterface=null;

    }

    };

    private void initService() {

    Intent intent =new Intent();

    //第一个参数是Service项目中的MyService所属包名,第二个为MyService的全路径名称

    intent.setComponent(newComponentName("com.example.administrator.aidldemo1",

    "com.example.administrator.aidldemo1.MyService"));

    //安卓5.0以后不允许隐式启动Service

    intent.setAction("aidl");

    bindService(intent,conn,Context.BIND_AUTO_CREATE);

    }

    调用aidl

    iMyAidlInterface.getCount(num1,num2);

    最后别忘了解绑服务

    @Override

    protected voidonDestroy() {

    super.onDestroy();

    unbindService(conn);

    }

    在运行Client项目时可能会报aidl方法无法找到的异常,此时只需要cliean Project,然后同步一下,运行即可

    下一篇写Aidl的复杂数据类型传递以及aidl的原理解析

    如有不当,欢迎留言。






    展开全文
  • 1、安卓进程的概念 一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他...

    1、安卓单进程的概念
            一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。

    2、单进程存在的问题
            每个进程所能使用的资源是有限,特别是内存,安卓系统对用户进程有严格的内存要求,超过此内存限制时,应用将OOM和崩溃。

            很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题。为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如大图片的处理、子进程记录运行轨迹等。

    3、怎样使用多进程
            Android多进程创建很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可。命名之后,就成了一个单独的进程。

    process分私有进程和全局进程:

    3.1、私有进程的名称前面有冒号,例如:

    <service
                android:name="con.tt.business.record.RecordService"
                android:process="con.tt.business.record.RecordService:record"/>


    3.2、全局进程的名称前面没有冒号,例如:

    <service
                android:name="con.tt.business.record.RecordService"
                android:process="con.tt.business.record.RecordService.record"/>


         为了节省系统内存,在退出该Activity的时候可以将其杀掉(如果没有人为的调用代码杀掉该进程,在程序完全退出时该进程会被系统杀掉)。 通常情况没有被杀掉的空进程也可以避免下次使用时再次创建进程, 这个有利有弊。

    3.3、私有进程 与  全局进程 的 区别

            全局的进程,可以被其他应用共用。“共用”指的是不同的App的组件运行在同一个指定的进程中, 只不同的app的组件的 android:process 声明的进程名称是 相同的 且是 以小写字母开头。 那么不同的APP的组件都可以进行这个 名称的进程中。

    需要注意的一点:
    那么我们先来看看Android5.0以下的源码,ActivityManagerService是如何关闭在应用退出后清理内存的

    Process.killProcessQuiet(pid);  


    应用退出后,ActivityManagerService就把主进程给杀死了,但是,在Android5.0以后,ActivityManagerService却是这样处理的:

    Process.killProcessQuiet(app.pid);  
    Process.killProcessGroup(app.info.uid, app.pid); 

     
    在应用退出后,ActivityManagerService不仅把主进程给杀死,另外把主进程所属的进程组一并杀死,这样一来,由于子进程和主进程在同一进程组,子进程在做的事情,也就停止了。所以在Android5.0以后的手机应用在进程被杀死后,要采用其他方案。

     

    4、多进程的缺点:
    4.1、Application的onCreate()多次执行

    多进程被创建好了,应用运行时就会对进程进行初始化,如果一个application中有多个进程,在进行全局初始化时,多进程会被初始化多次。

            解决方法:通过判断当前进程是不是 应用包名(默认进程名就是应用包名),来决定需不需要进行初始化相关的操作。

    private String getCurrentProcessName() {
         String currentProcName = "";
         int pid = android.os.Process.myPid();
         ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
         for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == pid) {
                currentProcName = processInfo.processName;
                break;
            }
          }
          return currentProcName;
    }


            如果子进程也需要一些初始化,则可根据进程名称来分别做对应的 初始化 即可,并且只初始化当前进程需要的业务,即按照进程按需初始化。

     

    4.2、调试麻烦

    多进程开发,调试起来很麻烦,比如希望在子进程创建后的首行代码里 添加断点,这是做不到。 因为Android Studio添加调试器的时候,会让你选一个调试的进程,而这时这个子进程还没有启动起来, 一旦你启动起来后,首行代码就执行完毕了,就无法再添加调试了

           解决方法:1、可以在子进程启动后, 添加几秒的延迟 再来启动业务逻辑, 比如延迟5秒,而这5秒就是留给你去Android Studio中添加 断点的

           2、调试时关闭子进程,例如某些操作是在一个  Service时执行的,这时先把 service放到主进程中,等业务代码写完了,再放到子进程 进行 功能测试。

    4.3、不能内存共享

            同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。    会引起一些问题,如:静态成员的失效。 

    4.4、文件共享问题。

           多进程情况下会出现两个进程在同一时刻访问同一个数据库文件的情况。这就可能造成资源的竞争访问,导致诸如数据库损坏、数据丢失等。在多线程的情况下我们有锁机制控制资源的共享,但是在多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现。解决办法就是多进程的时候不并发访问同一个文件,比如子进程涉及到操作数据库,就可以考虑调用主进程进行数据库的操作。

    4.5、sharePreference不能在多进程中通用

          在主进程中往sharePreference存的值,在子进程不能立即可见。

     

         解决方法1:使用SharedPreferences时,SharedPreferences 在MODE_PRIVATE MODE_PUBLIC 之外其实还可以设置多进程的Flag,即 MODE_MULTI_PROCESS。

    SharedPreferences myPrefs = context.getSharedPreferences(MY_FILE_NAME, Context.MODE_MULTI_PROCESS | Context.MODE_PRIVATE);
    
    

    一旦我们设置了这个Flag,每次调用Context.getSharedPreferences 的时候系统会重新从SP文件中读入数据,因此我们在使用的时候每次读取和存入都要使用Context.getSharedPreferences 重新获取SP实例。即使是这样,由于SP本质上并不是多进程安全的,所以还是无法保证数据的同步,因此该方法我们并没有使用,我们也不推荐使用。

     

          解决方法2:

     github链接: tray安卓多进程安全的sharePreferences

       如果SP不是多进程安全的,那么是否有多进程安全的,又有SP功能的第三方项目呢。答案是有的,Tray——一个多进程安全的SharedPreferences,我们可以在Github上找到它,如果是AndroidStudio,可以直接使用Gradle引入,可谓是十分方便,如下是使用的代码,十分简单,没有apply commit,看起来比SP还要简单。

    但是最终我们并没有选择使用它,主要的原因是它需要minSdk 为15,而我们是支持sdk14的,所以只能果断放弃了。

    4.6、多进程的通信问题

    同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。    但通常我们的业务代码都是有关联,很少有 能开启多进程、同时又不需要进程进程通信的 业务场景,因此这就需要多进程之间进行通信。

    Android中提供了三种进程通信方法:

    系统实现。
    AIDL(Android Interface Definition Language,Android接口定义语言):大部分应用程序不应该使用AIDL去创建一个绑定服务,因为它需要多线程能力,并可能导致一个更复杂的实现。
    Messenger:利用Handler实现。(适用于多进程、单线程,不需要考虑线程安全),其底层基于AIDL。
    4.7、多进程暖启动的恢复问题 

      在主进程的MainActivity退出后,子进程还在运行,这时用户又从手机桌面上点击应用图标启动了主进程,若业务功能中 主进程 与 子进程 有通信,那么此时 应该让 上次断开的主进程与子进程连接  再 重新连接上。  这里就需要额外的判断。

     

    5、Messenger实现多进程通信
    1、第一步:在主进程中启动  标记为多进程的 service

     

    2、第二步:利用connectin中回调的 IBinder 接口 创建一个 Messenger, 它用于 主进程 向 子进程 发送消息

     

    3、第三步:子进程的Service的 onBind 创建一个 Messenger 并返回给主进程,这个Messager用于  子进程 向 主进程 发送消息

     

    4、第四步:将子进程的service中创建好的 Messenger 通过 onBind 方法返回给 主进程 iBinder

     

    5、第五步:建立连接

        主进程  必须 先发送一条 消息到 子进程中, 子进程才知道 回传消息 应该 发送给谁。  这时 主进程 就是 客户端,  子进程  就是 服务端, 服务端在被动的等待客户端 发起连接请求。  在服务端 收到 客户端的 连接后,服务端需要 记录下 客户端的链接,以便 服务端 知道后续的消息应该 发送给谁。
    ————————————————
    原文链接:https://blog.csdn.net/u013394527/article/details/80775899

    展开全文
  • 多进程以及进程间通信机制虽然不是所有的app都能用到,但是这些知识必须要了解,同时app保活也是给用户提供更好的服务的方式,本文大家一起来了解一下。 多进程 1.一般情况下,一个应用程序就是一个进程,这个进程...
  • **当一个程序第一次启动的时候,Android会去动一个Linux进行和一个主线程,默认情况下,所有改程序组件都将在该进程和线程中 运行,同时Android会为每个应用程序分配一个单独的Linux用户,Android会尽量保留一个正在...
  • 但是这些是在一个进程上运行的,如果我们需要不同进程传输数据(通信),这时候我们就需要用到aidl(Android Interface Definition Language)语言进行编写,这就是涉及到安卓底层的ipc通信中的bindler,废话不说...
  • 要实现IPC(跨进程通信),可以使用官方给我们提供的Messenger机制和AIDL机制。 其中Messenger使用简单,适用于大部分多进程、单线程的应用, AIDL适用于较为复杂的多进程、多线程的应用。 这里我们介绍Messenger的...
  • 一个进程需要知道另一个进程的状态,需要实现进程通信aidl。然后我们需要后台服务唤醒进程,同时可以在后台做一些悄悄的事情,系统又杀不死,于是被认为是流氓软件,像qq微信也是这样的。但是随着安卓版本提升,...
  • IPC进程间通信/跨进程通信

    千次阅读 多人点赞 2019-02-16 09:50:36
    一个进程可以包含个线程,在安卓中有一个主线程也就是UI线程,UI线程才可以操作界面,如果在一个线程里面进行大量耗时操作在安卓中就会出现ANR(Application Not Responding)Android中IPC来源IPC不是安卓中独有的 ...
  •  说起android中多进程通信,大家首先想到的是aidl,今天我们就来复习一下aidl在多进程之间的通信,根据官方文档,aidl全拼是Android Interface Definition Language,安卓接口定制语言.作用就是在安卓设备中多个...
  • 最近有好多大学生和我来说想入门Android,所以写下这篇文章来给...从 Flutter 发布到现在的大半年时间,我接触到很前端、Android、iOS的开发者,超过 80% 的人告诉我他正在学或打算学 Flutter 。但是大部分开发.
  • 一个进程需要知道另一个进程的状态,需要实现进程通信aidl。然后我们需要后台服务唤醒进程,同时可以在后台做一些悄悄的事情,系统又杀不死,于是被认为是流氓软件,像qq微信也是这样的。但是随着安卓版本提升,...
  • 这一章本来是讲安卓进程通信的,也就是IPC。但由于实在是纠结于进程和线程在同步和通信上的异同,就索性查了一大波资料,结合自己的认识,把这一篇扩充成了进程的通信和同步,以及线程的通信和同步。希望以此告别...
  • 最近要面试了 没 时间玩了.看了下安卓icp ,说实话一直没过aidl这东东 发现网上帖子好多 下载的却好少 .好吧自己玩了一个 留下做个备注吧. ... 服务端接受用户在文本框输入文字 ...看到网上很例子都是服务端只有一个s...
  • Android 跨进程通信

    2021-02-20 14:29:51
    学习多进程通信之前,需要先了解一下多进程的基础知识, 进程的定义 在安卓中,进程是系统资源分配的最小单位,而线程是进程内部独立执行单元,是程序执行的最小单位。进程间的资源和数据互相隔离,而进程内的线程...
  • 前 言应用层开发者想要在Android端更上一层,Android基础知识、启动过程、编译打包apk过程、安卓framework层等实现原理都是一定要掌握的,熟悉安卓四大组件的深层通信过程及原理和Android构建工具gradle的实现原理也...
  • Android开发中的跨进程通信方式总结

    千次阅读 2020-01-25 00:29:21
    安卓开发过程中,为了保证每个应用的程序的不是独立的个体,需要对外提供接口,可以使个应用程序之间可以进行数据交换,所以app之间的通信应用场景有很...本文论述了Android开发中常用的跨进程通信的方式和方法。
  • 它的诞生就是为了给不同应用提供内容访问,自然在我们研究的“多进程通信方式”之中。 ContentProvider封装了数据的跨进程传输,我们可以直接使用getContentResolver()拿到ContentResolver进行增删改查即...
  • Android多进程 哪个大型项目不是多进程的?进程间最基本的通信原理你了解多少? 进程间通信基本原理 进程间通信的原理 Binder 的作用 Binder 的使用场景 Binder 是什么? 什么时候需要用到进程间通信? 为什么要...
  • 内容来自:...主要用于多进程通信。比Messenger,它具有支持多线程优势 注意事项: 为了线程安全考虑,服务端可以使用多线程处理到来的请求 客户端发送给服务端的请求如果需要好几毫
  • 这是一个IPC进程间AIDL方式通信的简单Demo。包括服务端和客户端.rar,太无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 当然我们还知道android中很多manager都是运行在system server进程中的,像AMS,PMS,WMS等,它们都是通过binder来进程远程调用,说到这就不得不说多进程之间的通信问题,进程不像线程那样,多线程可以共享内存,而每...
  • 怎么使用多进程安卓的四大组件设置process属性值例如:android:process=":test"或者 android:process="com.lz.test.process"上述指定进程方式的不同,以:号开头的进程名字是包名+:test,而...
  • IPC是Inter-Process Communication的缩写,意思就是进程通信,两个进程之间进行数据交换的过程。什么是进程,什么是线程。按照操作系统中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源。而进程...
  • 众所周知,AIDL是进程通信很常用的一种通信方式,很时候你总会觉得它非常复杂而又乱其实,你写一个demo你就懂了而且最好的理解方式也是你自己亲手写一个demo!下面我们通过一个最简单的demo来所说AIDL到底是怎么...
  • 首先声明,楼主不是什么大牛,没有牛逼的技术,只是公司扩招团队,有幸作为技术面试官,面试了这么多人之后的感想,希望对大家有一点点帮助。 一. 背景说明 本文档是基于谷歌安卓R 的 beta1 版本的变更输出的兼容...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 137
精华内容 54
关键字:

安卓多进程通信