您当前的位置:首页 > 互联网教程

android 开发多进程有什么用

发布时间:2025-05-14 13:43:27    发布人:远客网络

android 开发多进程有什么用

一、android 开发多进程有什么用

1、一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名,进程是系统分配资源和调度的基本单位,每个进程都有自己独立的资源和内存空间,其它进程不能任意访问当前进程的内存和资源,系统给每个进程分配的内存会有限制。

2、如果一个进程占用内存超过了这个内存限制,就会报OOM的问题,很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题,如果此时在程序中人为地使用GC会严重影响程序运行的流畅性,并且有时候并没有什么卵用,多数时候我们可以在android:minSdkVersion=”11”及以上的应用中,给AndroidManifest.xml的Application标签增加”android:largeHeap=”true”“这句话,请求系统给该应用分配更多可申请的内存:

3、有时候并不能彻底解决问题,比如API Level小于11时,或者是应用需要的内存比largeHeap分配的更大的时候;当该应用在后台时,仍然占用着的内存,系统总的内存就那么多,如果每个应用都向系统申请更多的内存,会影响整机运行效率。

4、为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如Flash、视频播放页面,频繁绘制的页面等。Android多进程使用很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可,process分私有进程和全局进程,私有进程的名称前面有冒号,全局进程没有,like this:

5、为了节省系统内存,在退出该Activity的时候可以将其杀掉(如果没有人为杀掉该进程,在程序完全退出时该进程会被系统杀掉),like this:

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

1、Android进程间通信的几种方式定义多进程

2、第一:Android应用中使用多进程只有一个办法(用NDK的fork来做除外),就是在AndroidManifest.xml中声明组件时,用android:process属性来指定。

3、不知定process属性,则默认运行在主进程中,主进程名字为包名。

4、android:process= package:remote,将运行在package:remote进程中,属于全局进程,其他具有相同shareUID与签名的APP可以跑在这个进程中。

5、android:process=:remote,将运行在默认包名:remote进程中,而且是APP的私有进程,不允许其他APP的组件来访问。

6、静态成员和单例失效:每个进程保持各自的静态成员和单例,相互独立。

7、线程同步机制失效:每个进程有自己的线程锁。

8、SharedPreferences可靠性下降:不支持并发写,会出现脏数据。

9、Application多次创建:不同进程跑在不同虚拟机,每个虚拟机启动会创建自己的Application,自定义Application时生命周期会混乱。

10、综上,不同进程拥有各自独立的虚拟机,Application,内存空间,由此引发一系列问题。

11、可传递基本类型,String,实现了Serializable或Parcellable接口的数据结构。Serializable是Java的序列化方法,Parcellable是Android的序列化方法,前者代码量少(仅一句),但I/O开销较大,一般用于输出到磁盘或网卡;后者实现代码多,效率高,一般用户内存间序列化和反序列化传输。

12、对同一个文件先后写读,从而实现传输,Linux机制下,可以对文件并发写,所以要注意同步。顺便一提,Windows下不支持并发读或写。

13、Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。

14、双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。

15、AIDL通过定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。

16、通过编写aidl文件来设计想要暴露的接口,编译后会自动生成响应的java文件,服务器将接口的具体实现写在Stub中,用iBinder对象传递给客户端,客户端bindService的时候,用asInterface的形式将iBinder还原成接口,再调用其中的方法。

17、系统四大组件之一,底层也是Binder实现,主要用来为其他APP提供数据,可以说天生就是为进程通信而生的。自己实现一个ContentProvider需要实现6个方法,其中onCreate是主线程中回调的,其他方法是运行在Binder之中的。自定义的ContentProvider注册时要提供authorities属性,应用需要访问的时候将属性包装成Uri.parse("content://authorities")。还可以设置permission,readPermission,writePermission来设置权限。 ContentProvider有query,delete,insert等方法,看起来貌似是一个数据库管理类,但其实可以用文件,内存数据等等一切来充当数据源,query返回的是一个Cursor,可以自定义继承AbstractCursor的类来实现。

18、学过计算机网络的对Socket不陌生,所以不需要详细讲述。只需要注意,Android不允许在主线程中请求网络,而且请求网络必须要注意声明相应的permission。然后,在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,连通后就可以进行通信。

三、android多进程怎么debug

1、在Android Studio中启动Debug模式,首先打开Android Studio并加载一个示例项目。接着,在工具栏上点击调试按钮,或者通过菜单选择“Run”-“Debug...”启动程序。在弹出的“Choose Device”对话框中,选择合适的设备进行调试。设置好断点后,让程序暂停在断点处。值得注意的是,断点的设置可以根据个人需求随时调整。

2、另一种调试方式是Attach方式。首先,选择菜单中的“Run”-“Attach debuger to Android process”,在随后的“Choose Process”对话框中,挑选需要调试的进程。设置好断点后,程序将暂停在断点处,以便于我们进行深入分析和调试。

3、在调试过程中,断点的使用非常重要。合理地设置断点可以帮助我们更有效地定位问题所在。断点可以设置在代码的任何地方,只要符合调试需求即可。例如,在关键逻辑执行前后、异常处理部分、数据输入输出等环节都可以设置断点。

4、除此之外,我们还可以通过查看变量值、调用栈等方式,进一步了解程序的运行情况。当程序暂停在断点处时,可以在调试工具栏中查看当前的调用栈信息,以及变量的当前值。这对于理解程序的执行流程和数据流动非常有帮助。

5、此外,Android Studio还提供了丰富的调试功能,如条件断点、数据视图、表达式求值等。条件断点允许我们根据特定条件暂停程序,而数据视图和表达式求值功能则帮助我们更深入地了解程序状态。

6、通过上述方法,我们可以有效地利用Android Studio进行多进程调试,提高开发效率,确保应用的稳定性和可靠性。