您的位置:首页 > 大数据 > 人工智能

Android进程间通讯——AIDL,Messenger(信使),ContentProvider,Clipboard(剪切板)

2015-03-09 17:06 519 查看
今天逛论坛看到这么一个问题: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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: