Every Activity in Android is a Process,or One Application is one process
All activities inside an application run in one process?
It depends on value of android:process
attribute in application manifest.
if attribute android:process
is not defined for Application/Activity tags in the manifest, by default all the activities will run in single process (process name will be name of the package defined in manifest)
<?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>
In the above manifest all activities run in process com.so.test
,ps command output in adb shell:
# ps
app_39 668 33 84492 20672 ffffffff afd0c51c S com.so.test
If android:process
is specified for Activity new process will be created with the same userid and the activity runs in that 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>
If the manifest is defined like above
Activity1 runs in com.so.p1 process
Activity2 runs in com.so.p2 process
Activity3 runs in com.so.p3 process
ps output in adb shell
# 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
If an Activity needs to be run in another process not defined in this manifest, both APKs should be signed with the same certificate.
No the activities of one application don't run on a different process each. And actually, even different applications built by the same developer (if the same certificate is used for all applications) could run in the same process!
As the documentation says:
Application modularity – The Android system allows applications that are signed by the same certificate to run in the same process, if the applications so requests, so that the system treats them as a single application. In this way you can deploy your application in modules, and users can update each of the modules independently if needed.
You are able to use [multi-processing][1] application approach using Manifest component element with android:process
attribute. It is applied for all components
<application>
<activity/>
<service/>
<receiver/>
<provider/>
</application>
Additionally <application>
element also supports an android:process
attribute, to set a default value that applies to all components.
By default a component
process name
is a package name. It can be overrode by <application>
or <android component>(the biggest priority)
element
Please note that each app process has is own Application instance. As a result if you define your own custom application class (<application android:name=".CustomApplication" ...>
) be ready that at least Application.onCreate()
will be called every time during creating a new process.
JFYI, please note that ContentProvider.onCreate()
is called before any other inits like Application.onCreate()
etc. It can be helpful to get a Context
for your library without extra code from dev side
To get process name you can use the next method
@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;
}
or via Terminal
enter adb shell ps | grep <packagename>
[1]: https://developer.android.com/guide/components/processes-and-threads#Processes