Android中的每个活动都是一个流程,或者一个应用程序是一个流程

时间:2011-06-24 12:59:26

标签: android process android-activity ipc

在此页面http://androidapps.org.ua/androidintro_ipc.html中,活动之间的意图切换被描述为进程间通信。现在我很困惑每个活动是否是android中的单独进程或应用程序内的所有活动都是一个进程。我使用以下方法检查了我的应用程序中所有活动和服务的进程ID:

 int id = android.os.Process.myPid();
 System.out.println("Process id of Activity1 :"+id);

但它显示的是相同的进程ID。 请回复。

4 个答案:

答案 0 :(得分:43)

All activities inside an application run in one process?

它取决于应用程序清单中android:process属性的值。

如果没有为清单中的Application / Activity标记定义属性android:process,默认情况下所有活动都将在单个进程中运行(进程名称将是清单中定义的包的名称)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.so.test" android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Activity1">
        </activity>
        <activity android:name=".Activity2">
        </activity>
        <activity android:name=".Activity3">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

在上面的清单中,所有活动都在进程com.so.test中运行,adb shell中的ps命令输出:

# ps
app_39    668   33    84492  20672 ffffffff afd0c51c S com.so.test

如果为Activity指定了android:process,则将使用相同的用户ID创建新进程,并且该进程将在该进程中运行。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.so.test" android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name" 
     android:process="com.so.p1">
        <activity android:name=".Activity1">
        </activity>
        <activity android:name=".Activity2" android:process="com.so.p2">
        </activity>
        <activity android:name=".Activity3" android:process="com.so.p3">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

如果清单定义如上

Activity1 runs in com.so.p1 process
Activity2 runs in com.so.p2 process
Activity3 runs in com.so.p3 process
adb shell中的

ps输出

# ps
app_39    650   33    83192  20900 ffffffff afd0c51c S com.so.p1
app_39    659   33    83188  20864 ffffffff afd0c51c S com.so.p2
app_39    668   33    84492  20672 ffffffff afd0c51c S com.so.p3

如果活动需要在此清单中未定义的其他流程中运行,则两个APK都应使用相同的证书进行签名。

答案 1 :(得分:5)

一个应用程序的活动不会在不同的进程上运行。实际上,即使是同一个开发人员构建的不同应用程序(如果所有应用程序使用相同的证书)也可以在同一个进程中运行!

As the documentation says:

  

应用程序模块化 - Android   系统允许应用程序   由相同的证书签名运行   在同一过程中,如果   应用程序如此请求,以便   系统将它们视为一个单一的   应用。这样你就可以   在模块中部署应用程序,   并且用户可以更新每个   如果需要,可以单独使用模块。

答案 2 :(得分:1)

您可以使用带有android:process属性的清单组件元素的multi-processing应用程序方法。它适用于所有组件<activity><service><receiver><provider>。另外,<application>元素还支持android:process属性,以设置适用于所有组件的默认值。

默认情况下,component process name是程序包名称。可以被<application><android component>(the biggest priority)元素

覆盖

请注意,每个应用程序进程都有自己的应用程序实例。因此,如果您定义了自己的自定义应用程序类(<application android:name=".CustomApplication" ...>),请准备好在创建新进程期间每次至少调用Application.onCreate()

要获取进程名称,可以使用下一种方法

@Nullable
public static String getProcessName(Context context) {
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : activityManager.getRunningAppProcesses()) {
        if (processInfo.pid == android.os.Process.myPid()) {
            return processInfo.processName;
        }
    }
    return null;
}

或通过Terminal输入adb shell ps | grep <packagename>

答案 3 :(得分:0)

您可以将意图发送到另一个应用程序,前提是它具有intent-filter。

所以,您的应用程序中的所有活动都将在同一个过程中运行。

例如:您可以向所有电子邮件应用程序发送通用意图。 Gmail就是这样一个应用程序,它有一个用于侦听电子邮件意图的intent过滤器。这是您使用意图实现IPC的方式。