今天逛论坛看到这么一个问题:android中同一个应用程序的activity和service属于同一个进程吗?回答什么的也有啊。在这里简单的记录一下。
在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service和Activity有运行在同一个进程中(adb shell dumpsys |grep PID |grep 关键字),也有可能运行在不同的进程中。一般情况下,同一个应用程序的Activity组件都是运行在同一个进程中,但是,如果Activity配置了android:process这个属性,那么,它就会运行在自己的进程中。如果android:process属性的值以":"开头,则表示这个进程是私有的;如果android:process属性的值以小写字母开头,则表示这是一个全局进程,允许其它应用程序组件也在这个进程中运行。
原因看一下源码在frameworks/base/core/java/android/content/pm/PackageParser.java文件中:
private boolean parseApplication(Package owner, Resources res,
XmlPullParser parser, AttributeSet attrs, int flags, String[] outError)
throws XmlPullParserException, IOException {
final ApplicationInfo ai = owner.applicationInfo;
final String pkgName = owner.applicationInfo.packageName;
TypedArray sa = res.obtainAttributes(attrs,
com.android.internal.R.styleable.AndroidManifestApplication);
......
if (outError[0] == null) {
CharSequence pname;
if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) {
pname = sa.getNonConfigurationString(
com.android.internal.R.styleable.AndroidManifestApplication_process, 0);
} else {
// Some older apps have been seen to use a resource reference
// here that on older builds was ignored (with a warning). We
// need to continue to do this for them so they don't break.
pname = sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestApplication_process);
}
ai.processName = <span style="color:#006600;">buildProcessName(ai.packageName, null, pname,
flags, mSeparateProcesses, outError); </span>
......
}
......
}
从调用parseApplication函数解析application标签开始,通过调用buildProcessName函数对android:process属性进解析,接着又会调用buildCompoundName进一步解析,这里传进来的参数pkg就为你的包名,参数procSeq为MainActivity的属性android:process的值你清单文件中设置的值,进一步将这个字符串保存在本地变量proc中。如果proc的第一个字符是":",则只需要调用validateName函数来验证proc字符串里面的字符都是合法组成就可以了,即以大小写字母或者"."开头,后面可以跟数字或者"_"字符;如果proc的第一个字符不是":",除了保证proc字符里面的字符都是合法组成外,还要求至少有一个"."字符。
参考网址:
http://blog.csdn.net/luoshengyang/article/details/6720261#reply