我有这个AndroidManifest.xml文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionName="1.0.0.0721"
android:process="com.lily.process" package="com.lily.test">
<provider android:authorities="com.lily.test"
android:name="com.lily.test.provider"
android:process="com.lily.process">
</provider>
“android:process”作为清单标记和提供者标记添加,我知道如果它被添加为提供者标记,则提供者可以在“com.lily.process”过程中运行。但是当它作为清单标签编写时,它的用法是什么? 我尝试过,但并非所有组件都可以在它识别的过程中运行。
答案 0 :(得分:109)
我同意没有多少人会发现android:process有用作应用程序标记的属性。但是,我发现它作为 activity 标记的属性非常有用。
android:process
对活动的目的是指定您的活动应在具有特定名称的流程中启动。该名称的选择既可以用于隔离其自身进程中的活动(与启动它的进程不同),也可以用于强制它与单个进程同居,并与其他使用相同名称的活动共存。
根据开发指南(http://developer.android.com/guide/topics/manifest/activity-element.html):
“如果分配给此属性的名称以冒号(':')开头,则在需要时创建一个专用于应用程序的新进程,并且该进程在该进程中运行。如果进程名称以小写字符,活动将在该名称的全局进程中运行,前提是它有权这样做。这允许不同应用程序中的组件共享进程,从而减少资源使用。“
我最近发现这个属性对于解决我在启动应用程序的帮助活动时遇到的问题很有用,在某些情况下,该应用程序非常接近仍然适用于某些设备的16MB堆限制。在这些情况下,启动其帮助活动会使我的应用超过极限,从而导致力量关闭。
通过使用android:process
标记,我能够指定我的帮助活动应该在它自己的单独进程中启动。这个进程有自己的16MB堆,它没有计入启动它的主应用程序堆。这会永久性地完全阻止我的应用程序耗尽堆空间并在启动帮助时崩溃。
如果您的启动应用具有包名称
com.mycompany.mymainapp
因此,如果使用
,则为其分配一个与该字符串相同的进程名称android:process=":myhelp"
在已启动的活动中,将为其分配流程名称
com.mycompany.mymainapp:myhelp
该流程将拥有自己独立的流程ID,您可以查看(例如在DDMS中)。
至少,这是我的经历。到目前为止,我的测试是在运行CM6(Android 2.2.1)的旧Moto Droid上进行的,配置为具有16MB的堆限制。
在我的情况下,由于我不希望用户将帮助视为与我的应用分开,所以我包含了
android:excludeFromRecents="true"
属性可防止帮助活动出现在最近的应用(长按主页)列表中。我还包括
android:taskAffinity="com.mycompany.mymainapp.HelpActivity"
其中HelpActivity是帮助活动的名称,用于在自己的任务中隔离活动
我还补充说:
android:launchMode="singleInstance"
以防止每次用户调用帮助时都会创建此应用的多个实例。
我还添加了标志:
Intent.FLAG_ACTIVITY_NEW_TASK
用于启动帮助活动的Intent。
这些参数可能需要也可能不需要,具体取决于您对android:process
属性的使用情况。
考虑到在为Android设备开发时遇到内存限制的频率,在某些情况下,使用一种技术可以让您将应用程序的某些部分划分为单独的进程,每个进程都有自己的堆,这似乎是一个很棒的礼物。这样做可能存在隐藏的危险,我还没有考虑或经历,但到目前为止,在我的特定情况下如此好。
答案 1 :(得分:5)
@Carl
可能存在隐患:
参考:http://developer.android.com/training/articles/memory.html#MultipleProcesses
这个过程现在几乎增加了两倍,达到4MB,只需显示即可 用户界面中的一些文字。这导致了一个重要的结论:如果你是 将您的应用程序拆分为多个进程,只有一个进程 应该负责UI。其他进程应该避免任何UI,如 这将迅速增加该过程所需的RAM(特别是 一旦你开始加载位图资产和其他资源)。然后它可能会 一旦绘制UI,就很难或不可能减少内存使用量。
答案 2 :(得分:1)
android:process和shareduserid可用于在包之间传递资源。 就我而言,现在这很方便了:)
答案 3 :(得分:0)
android:process 应该与注意
一起使用(在下面的链接中引用)
Android鲜为人知且似乎未记录的行为是,应用程序的每个进程都有自己的Application实例。
因此,如果您有在不同进程中运行的服务,则调用startService()将为您的应用初始化Appplication类。
更多信息— Starting Service in Android calls Applications onCreate