正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行。但是如果需要将某些组件(如Service、Activity等)运行在单独的进程中,就需要用到android:process属性了。我们可以为android的基础组件指定process属性来指定它们运行在指定进程中。
默认情况下,同一应用的所有组件均在相同的进程中运行,且大多数应用都不会改变这一点。 但是,如果您发现需要控制某个组件所属的进程,则可在清单文件中执行此操作。
各类组件元素的清单文件条目—
<activity>、<service>、<receiver> 和 <provider>
—均支持 android:process 属性,此属性可以指定该组件应在哪个进程运行。您可以设置此属性,使每个组件均在各自的进程中运行,或者使一些组件共享一个进程,而其他组件则不共享。 此外,您还可以设置 android:process,使不同应用的组件在相同的进程中运行,但前提是这些应用共享相同的 Linux 用户 ID 并使用相同的证书进行签署。
此外,
<application>
元素还支持 android:process 属性,以设置适用于所有组件的默认值。
如果内存不足,而其他为用户提供更紧急服务的进程又需要内存时,Android 可能会决定在某一时刻关闭某一进程。在被终止进程中运行的应用组件也会随之销毁。 当这些组件需要再次运行时,系统将为它们重启进程。
决定终止哪个进程时,Android 系统将权衡它们对用户的相对重要程度。例如,相对于托管可见 Activity 的进程而言,它更有可能关闭托管屏幕上不再可见的 Activity 的进程。 因此,是否终止某个进程的决定取决于该进程中所运行组件的状态。 下面,我们介绍决定终止进程所用的规则。
Intent
|
只能传输Bundle所支持的数据类型
|
四大组件的进程间通信
|
不适合高并发
|
简单的数据共享,无高并发场景
|
功能强大,支持一对多并发实时通信
|
适用稍微复杂,需要注意线程同步
|
复杂的进程间调用,Android中最常用
|
Messenger
|
比AIDL稍微简单易用些
|
比AIDL功能弱,只支持一对多串行实时通信
|
简单的进程间通信
|
ContentProvider
|
功能强大的数据共享能力,可通过call方法扩张
|
受约束的AIDL,主要对外提供数据线的CRUD操作
|
进程间的大量数据共享
|
RemoteViews
|
在跨进程方法UI方面有奇效
|
比较小众的通信方式
|
某些特殊的场景
|
Socket
|
跨主机,通信范围广
|
只能传输原始的字节流
|
常用与网络通信中
|
1 2 3 4 5 6 7 8 9 10 11
|
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Window window = getWindow(); window.setGravity(Gravity.LEFT|Gravity.TOP); WindowManager.LayoutParams params = window.getAttributes(); params.x = 0; params.y = 0; params.height = 1; params.width = 1; window.setAttributes(params); }
|