Подтвердить что ты не робот

Каждая активность в Android - это процесс или одно приложение - это один процесс

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Как говорится в документации:

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

Ответ 3

Вы можете использовать многопроцессорный прикладной подход, используя компонент компонента Manifest с атрибутом android:process. Применяется для всех компонентов

<application>
    <activity/>
    <service/>
    <receiver/>
    <provider/>
</application> 

Дополнительно элемент <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>

Ответ 4

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

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

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