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

Nab*_*aba 23 android ipc process android-activity

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

 int id = android.os.Process.myPid();
 System.out.println("Process id of Activity1 :"+id);
Run Code Online (Sandbox Code Playgroud)

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

Sur*_*esh 43

All activities inside an application run in one process?
Run Code Online (Sandbox Code Playgroud)

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

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

<?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>
Run Code Online (Sandbox Code Playgroud)

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

# ps
app_39    668   33    84492  20672 ffffffff afd0c51c S com.so.test
Run Code Online (Sandbox Code Playgroud)

如果android:process为Activity指定,则将使用相同的用户标识创建新进程,并且活动将在该进程中运行.

<?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>
Run Code Online (Sandbox Code Playgroud)

如果清单定义如上

Activity1 runs in com.so.p1 process
Activity2 runs in com.so.p2 process
Activity3 runs in com.so.p3 process
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果需要在此清单中未定义的另一个进程中运行活动,则应使用相同的证书对两个APK进行签名.


Amo*_*tir 5

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

正如文件所说:

应用程序模块化 - 如果应用程序请求,Android系统允许由同一证书签名的应用程序在同一进程中运行,以便系统将它们视为单个应用程序.通过这种方式,您可以在模块中部署应用程序,用户可以根据需要独立更新每个模块.