Каждое действие в Android - это процесс, или одно приложение - это один процесс - PullRequest
23 голосов
/ 24 июня 2011

На этой странице, http://androidapps.org.ua/androidintro_ipc.html, намеренное переключение между действиями описывается как межпроцессное взаимодействие.Теперь я запутался, является ли каждое действие отдельным процессом в Android или все действия внутри приложения - это один процесс.Я проверил идентификатор процесса всех операций и услуг в моем приложении, используя:

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

Но он показывает тот же идентификатор процесса.Пожалуйста, ответьте.

Ответы [ 4 ]

43 голосов
/ 06 июля 2011
All activities inside an application run in one process?

Это зависит от значения атрибута android:process в манифесте приложения.

, если атрибут 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, вывод команды ps в оболочке adb:

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

Если для действия задано 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" 
     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

вывод ps в оболочке adb

# 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

Если нужно запустить Activity в другом процессе, не определенном в этом манифесте, оба APK должны быть подписаны одним и тем же сертификатом.

5 голосов
/ 24 июня 2011

Нет, действия одного приложения не выполняются в разных процессах.И действительно, даже разные приложения, созданные одним и тем же разработчиком (если один и тот же сертификат используется для всех приложений), могут работать в одном и том же процессе!

Как указано в документации:

Модульность приложения. Система Android позволяет приложениям, подписанным одним и тем же сертификатом, запускаться в одном и том же процессе, если этого требуют приложения, поэтому система обрабатывает их как одно приложение.Таким образом, вы можете развертывать свое приложение в модулях, и пользователи могут обновлять каждый модуль независимо, если это необходимо.

1 голос
/ 08 мая 2019

Вы можете использовать мультипроцессный прикладной подход с использованием компонента компонента Manifest с атрибутом android:process.Применяется для всех компонентов <activity>, <service>, <receiver>, <provider>.Кроме того, элемент <application> также поддерживает атрибут android:process, чтобы установить значение по умолчанию, которое применяется ко всем компонентам.

По умолчанию component process name является именем пакета.Он может быть переопределен элементом <application> или <android component>(the biggest priority)

Обратите внимание, что каждый процесс приложения имеет собственный экземпляр Application.В результате, если вы определите свой собственный класс приложения (<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>

0 голосов
/ 24 июня 2011

Вы можете отправить намерение в другое приложение, если оно имеет фильтр намерений.

Так что да, все ваши действия в вашем приложении будут выполняться в одном и том же процессе.

Например: вы можете отправить общее намерение всем приложениям электронной почты.Gmail - одно из таких приложений, которое имеет фильтр намерений, который прослушивает намерения электронной почты.Вот как вы достигаете IPC, используя намерения.

...