web-dev-qa-db-ja.com

Androidのすべてのアクティビティはプロセスであるか、1つのアプリケーションは1つのプロセスです

このページでは、 http://androidapps.org.ua/androidintro_ipc.html 、アクティビティ間のインテント切り替えはプロセス間通信として説明されています。 Android)のすべてのアクティビティが個別のプロセスであるか、アプリケーション内のすべてのアクティビティが1つのプロセスであるかがわかりません。以下を使用して、アプリケーション内のすべてのアクティビティとサービスのプロセスIDを確認しました。

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

しかし、それは同じプロセスIDを示しています。返信してください。

23
Naba
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>

上記のマニフェストでは、すべてのアクティビティがadbシェルのプロセスcom.so.test、psコマンド出力で実行されます。

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

アクティビティに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シェルでの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に同じ証明書で署名する必要があります。

43
Suresh

1つのアプリケーションのアクティビティがそれぞれ異なるプロセスで実行されることはありません。実際、同じ開発者によって作成された異なるアプリケーション(すべてのアプリケーションに同じ証明書が使用されている場合)でも、同じプロセスで実行できます。

ドキュメントにあるように:

アプリケーションのモジュール性– Androidシステムでは、アプリケーションが要求した場合、同じ証明書で署名されたアプリケーションを同じプロセスで実行できるため、システムはそれらを単一のアプリケーションとして扱います。アプリケーションをモジュールにデプロイする方法。ユーザーは、必要に応じて各モジュールを個別に更新できます。

5

_Android:process_属性を持つマニフェストコンポーネント要素を使用して、 マルチプロセッシング アプリケーションアプローチを使用できます。すべてのコンポーネントに適用されます

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

さらに、_<application>_要素は_Android:process_属性もサポートし、すべてのコンポーネントに適用されるデフォルト値を設定します。

デフォルトでは、component _process name_はパッケージ名です。 _<application>_または<Android component>(the biggest priority)要素で上書きできます

各アプリプロセスにはownアプリケーションインスタンスがあることに注意してください。その結果、独自のカスタムアプリケーションクラス(_<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>_と入力します

2
yoAlex5

インテントフィルターがあれば、インテントを別のアプリケーションに送信できます。

したがって、はい、アプリケーション内のすべてのアクティビティは同じプロセスで実行されます。

例:すべての電子メールアプリケーションに汎用インテントを送信できます。 Gmailは、メールのインテントをリッスンするインテントフィルタを備えたアプリケーションの1つです。これは、インテントを使用してIPCを達成する方法です。

0
Reno