Every Activity in Android is a Process,or One Application is one process
Asked Answered
W

4

26

In this page, http://androidapps.org.ua/androidintro_ipc.html , intent switching between activities is described as Inter Process Communication. Now I am confused whether every activity is a separate process in android or All activities inside an application is one process. I have checked the process id of all activities and service in my Application using:

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

But it is showing same process id. Please reply back.

Weevil answered 24/6, 2011 at 12:59 Comment(0)
L
47
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.

Laliberte answered 6/7, 2011 at 6:0 Comment(3)
Activity1 runs in com.so.p1 process Activity2 runs in com.so.p2 process Activity3 runs in com.so.p3 process Will each process run in separate VM ? How it is encapsulated to that application ?Puttyroot
How about the service, broadcast are they each run in a separate process or the same as activity (i.e 3 processess)?Therapeutic
Note that local broadcasts do not work between different processes.Subternatural
S
5

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.

Sypher answered 24/6, 2011 at 13:6 Comment(2)
So if the scenario is like this:The four Application component(Activity,Service,Content Provider,Broadcast Receiver) runs in separate thread under one process . The thread of Activity is the main UI thread, if any changes done in other thread, it have to inform the main UI thread.Weevil
@Naba: "The four Application component(Activity,Service,Content Provider,Broadcast Receiver) runs in separate thread under one process" -- no. There is one process, but they all share the main application thread.Slit
P
3

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

Projective answered 8/5, 2019 at 11:44 Comment(0)
G
0

You can send an intent to another application, provided it has an intent-filter.

So yes all of your activities in your application will run in the same process.

For eg: You can send a generic intent to all email applications. Gmail is one such application that has a intent filter which listens to the email intent. This is how you achieve IPC using intents.

Glove answered 24/6, 2011 at 13:3 Comment(1)
So if the scenario is like this:The four Application component(Activity,Service,Content Provider,Broadcast Receiver) runs in separate thread under one process . The thread of Activity is the main UI thread, if any changes done in other thread, it have to inform the main UI threadWeevil

© 2022 - 2024 — McMap. All rights reserved.