当前位置:首页 » 密码管理 » 跨进程访问

跨进程访问

发布时间: 2022-12-28 06:47:09

① android开发中跨进程通信有几种方式

Android进程间通信的几种方式 定义多进程
第一:Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。
不知定process属性,则默认运行在主进程中,主进程名字为包名。
android:process = package:remote,将运行在package:remote进程中,属于全局进程,其他具有相同shareUID与签名的APP可以跑在这个进程中。
android:process = :remote ,将运行在默认包名:remote进程中,而且是APP的私有进程,不允许其他APP的组件来访问
第二:多进程引发的问题
静态成员和单例失效:每个进程保持各自的静态成员和单例,相互独立。
线程同步机制失效:每个进程有自己的线程锁。
SharedPreferences可靠性下降:不支持并发写,会出现脏数据。
Application多次创建:不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application,自定义Application时生命周期会混乱。
综上,不同进程拥有各自独立的虚拟机,Application,内存空间,由此引发一系列问题。
第三: 进程间通信
Bundle/Intent传递数据:
可传递基本类型,String,实现了Serializable或Parcellable接口的数据结构。Serializable是java的序列化方法,Parcellable是Android的序列化方法,前者代码量少(仅一句),但I/O开销较大,一般用于输出到磁盘或网卡;后者实现代码多,效率高,一般用户内存间序列化和反序列化传输。
文件共享:
对同一个文件先后写读,从而实现传输,Linux机制下,可以对文件并发写,所以要注意同步。顺便一提,Windows下不支持并发读或写。
Messenger:
Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
AIDL:
AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。
通过编写aidl文件来设计想要暴露的接口,编译后会自动生成响应的java文件,服务器将接口的具体实现写在Stub中,用iBinder对象传递给客户端,客户端bindService的时候,用asInterface的形式将iBinder还原成接口,再调用其中的方法。
ContentProvider:
系统四大组件之一,底层也是Binder实现,主要用来为其他APP提供数据,可以说天生就是为进程通信而生的。自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse("content://authorities")。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。
Socket:
学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。

② 线程、进程在跨线程(进程)访问内存,权限有什么不同


说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

说法二:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

说法三:多线程共存于应用程序中是现代操作系统中的基本特征和重要标志。用过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应用程序的执行都在操作系统内核中登记一个进程标志,操作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

线程的划分尺度小于进程,使得多线程程序的并发性搞。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:

●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。

在Unix操作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由操作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。

说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。

Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。

Unix操作系统和Microsoft Windows操作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行,操作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。

基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。

线程需要操作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。

需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。

③ 如何跨进程调用surfaceflinger的方法

Android SurfaceFlinger 详解 1. SurfaceFlinger 按英文翻译过来就 Surface 投递者。 就是把上层所画的各个 surface 进行处 理然后传给底层硬件来显示的一个功能。 2. 下图比较详细的阐述了 SurfaceFlinger 所起的作用。 Android 图形系统中一个重要的概念和线索是 surface。View 及其子类(如 TextView, Button) 要画在 surface 上。 每个 surface 创建一个 Canvas 对象 (但 属性时常改变),用来管理 view 在 surface 上的绘图操作,如画点画线。每个 canvas 对象对应一个 bitmap,存储画在 surface 上的内容。 每个 Surface 通常对应两个 buffer,一个 front buffer, 一个 back buffer。 其中,back buffer 就是 canvas 绘图时对应的 bitmap。因此,绘画总是在 back buffer 上,需要更新时,则将 back buffer 和 front buffer 互换。 The window is tied to a Surface and the ViewRoot asks the Surface for a Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot will call surface.unlockCanvasAndPost(canvas) to schele surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer Except for SurfaceViews, different views within the same ViewRoot share the same surface. Layer 的概念: 每个 surface 又对应一个 layer, SurfaceFlinger 负责将各个 layer 的 front buffer 合成(composite)绘制到屏幕上。 A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don't have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer Multiple layers are just composited to the final buffer in their Z order. 有几个对象与 Surface 概念紧密相关: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java) 。 该对象被应用间接调用(通过 SurfaceView, ViewRoot 等), 应用需要创建 surface,(并同时创建 canvas), 将图形绘制到这个对象上并最终投递到屏幕 上。 2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被 Java Surface 通过 Jni 调用,实现 Java Surface 的功能 3. ISurface (以及其派生类 BnSurface)。这个对象是应用和 server 之间的接 口。 C++ Surface 创建这个 ISurface (BnSurface) 并发送命令, 如更新 surface 内容到屏幕上。Server 端接受这个命令并执行相应操作。 研究一个 surface 如何创建的关键路径如下: 1. frameworks/base/core/java/android/view/Surface.java Surface::Surface () -- 2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。 在这个函数中 SurfaceComposerClient 对象被创建。 3.frameworks/base/libs/ui/SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了 client 和 server 之间的桥梁。通过函数 _get_surface_manager() 获 得 了 一 个 指 向 server 的 IBinder 对 象 ( 具 有 ISurfaceComposer 接口),之后通过这个 IBinder 就可以跨进程访问 Server 的 功能。接着调用 ISurfaceComposer::createConnection()创建并返回了一个 ISurfaceFlingerClient 的 IBinder。 4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -SurfaceComposerClient::createSurface(). 这 个 函 数 中 , 利 用 前 面 获 得 的 ISurfaceFlingerClient 的 IBinder,调用其 createSurface 接口。 5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface ()。BClient 由 ISurfaceFlingerClient 派生而来。 6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -SurfaceFlinger:: createSurface()。这个函数为 Surface 创建一个对应的 Layer。 上述关键路径中,1,2,3,4 运行于 client 进程中,而 5,6 运行与 server 进 程中。server 作为一个 service 提供给 client 访问。 与图形相关的代码主要位于下列目录: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget 4、frameworks/base/opengl/ 5、frameworks/base/libs/ui 6、frameworks/base/libs/surfaceflinger 7、frameworks/base/core/jni/android/graphics 8、frameworks/base/core/jni/android/opengl 9、frameworks/base/core/jni/android/android_view_*.cpp 10、external/skia 一、下列目录中的部分代码: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget android.graphics, android.view 和 android.widget 功能和其他类似的图形库 如 Qt/Gtk+差不多, 分别提供基本的图形原语 (如画点画线, 设置图形上下文等) , 事件机制, 以及开发图形用户界面的控件等。 canvas 用于开发 2D 图形, Surface 代表一个可供图形系统绘制的 surface。可在其上绘制 2D 活 3D 图形。

④ 安卓sharepreference能跨进程共享数据吗

使用的SharePreferences
都是使用模式Context.MODE_PRIVATE,这样就不能被其他程序访问到,用不同的模式可以实现跨进程,跨应用获取该文件内容

String content = null;
Context c = null;
try {
c = this.createPackageContext(PREFERENCE_PACKAGE,
Context.CONTEXT_IGNORE_SECURITY);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "" + c);
SharedPreferences sh = c.getSharedPreferences(PREFERENCE_NAME, Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);
content = sh.getString("tr069token3", null);
在Android 4.0上通过以上方法可以跨进程访问,之前没有加入Context.MODE_MULTI_PROCESS参数,导致不能获取到修改后的数据。在2.3的室内机上不能获取,没有权限。

⑤ android开发中跨进程通信有几种方式

  • 在android SDK中提供了4种用于跨进程通讯的方式,Activity、Content Provider、Broadcast和Service。

  • 介绍

  1. Activity可以跨进程调用其他应用程序;

  2. Content Provider可以跨进程访问其他应用程序中的数据;

  3. Broadcast可以向android系统中所有应用程序发送广播;

  4. Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务;

⑥ Android 进程间通信的几种实现方式

Android 进程间通信的几种实现方式

主要有4种方式:

这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。

主要实现原理:

由于应用程序之间不能共享内存。为了在不同应用程序之间交互数据(跨进程通讯),AndroidSDK中提供了4种用于跨进程通讯的方式进行交互数据,实现进程间通信主要是使用sdk中提供的4组组件根据实际开发情况进行实现数据交互。

详细实现方式:

Acitivity实现方式

Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的 Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过 Intent构造方法的第2个参数指定)。 在android系统中有很多应用程序提供了可以跨进程访问的Activity,例如,下面的代码可以直接调用拨打电话的Activity。

IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);


Content Provider实现方式

Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)

应用程序可以利用Content Provider完成下面的工作

1. 查询数据
2. 修改数据
3. 添加数据
4. 删除数据

Broadcast 广播实现方式

广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。


Service实现方式

常用的使用方式之一:利用AIDL Service实现跨进程通信

这是我个人比较推崇的方式,因为它相比Broadcast而言,虽然实现上稍微麻烦了一点,但是它的优势就是不会像广播那样在手机中的广播较多时会有明显的时延,甚至有广播发送不成功的情况出现。

注意普通的Service并不能实现跨进程操作,实际上普通的Service和它所在的应用处于同一个进程中,而且它也不会专门开一条新的线程,因此如果在普通的Service中实现在耗时的任务,需要新开线程。

要实现跨进程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨进程服务其实是采用C/S的架构,因而AIDL的目的就是实现通信接口。


总结

跨进程通讯这个方面service方式的通讯远远复杂于其他几种通讯方式,实际开发中Activity、Content Provider、Broadcast和Service。4种经常用到,学习过程中要对没种实现方式有一定的了解。

热点内容
java静态单例 发布:2025-08-16 23:34:52 浏览:326
平板拷贝如何缓存 发布:2025-08-16 23:19:05 浏览:599
缤越混动有哪些配置 发布:2025-08-16 23:17:57 浏览:247
删除linux文件后 发布:2025-08-16 23:09:04 浏览:648
采访时的采访问题 发布:2025-08-16 23:07:27 浏览:110
电脑客户端登录服务器怎么清除 发布:2025-08-16 22:55:46 浏览:525
压缩小木条 发布:2025-08-16 22:55:41 浏览:20
存款利率算法 发布:2025-08-16 22:48:44 浏览:588
php开发api接口 发布:2025-08-16 22:47:48 浏览:839
将ssd转化为hdd的高速缓存 发布:2025-08-16 22:39:04 浏览:910