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

前端 未结 4 683
野的像风
野的像风 2020-12-02 19:22

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 e

相关标签:
4条回答
  • 2020-12-02 19:48
    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.

    0 讨论(0)
  • 2020-12-02 19:49

    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

    0 讨论(0)
  • 2020-12-02 19:51

    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.

    0 讨论(0)
  • 2020-12-02 19:51

    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.

    0 讨论(0)
提交回复
热议问题