このページでは、 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を示しています。返信してください。
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に同じ証明書で署名する必要があります。
1つのアプリケーションのアクティビティがそれぞれ異なるプロセスで実行されることはありません。実際、同じ開発者によって作成された異なるアプリケーション(すべてのアプリケーションに同じ証明書が使用されている場合)でも、同じプロセスで実行できます。
アプリケーションのモジュール性– Androidシステムでは、アプリケーションが要求した場合、同じ証明書で署名されたアプリケーションを同じプロセスで実行できるため、システムはそれらを単一のアプリケーションとして扱います。アプリケーションをモジュールにデプロイする方法。ユーザーは、必要に応じて各モジュールを個別に更新できます。
_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>
_と入力します
インテントフィルターがあれば、インテントを別のアプリケーションに送信できます。
したがって、はい、アプリケーション内のすべてのアクティビティは同じプロセスで実行されます。
例:すべての電子メールアプリケーションに汎用インテントを送信できます。 Gmailは、メールのインテントをリッスンするインテントフィルタを備えたアプリケーションの1つです。これは、インテントを使用してIPCを達成する方法です。