Android-多入口多进程

  在清单文件中,给另一个Activity添加如下内容,设置为桌面启动入口

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

  清单文件中如下所示,两个Activity都存在上面intent-filter以及其中的内容,安装后将会在桌面显示两个应用图标
  现在启动两个桌面图标会进入同一个Activity,先注册哪个Activity为启动入口,两个图标启动后都会进入这个Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<!-- 如果不重新添加label和icon,将会使用application中对应的值 -->
<activity
android:label="@string/app_name2"
android:icon="@drawable/app_icon2"
android:name=".SplashActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

  将其中一个Activity设置为默认启动页面,此时将无视Activity注册启动入口的先后顺序,两个图标启动后都会进入这个Activity

1
2
3
4
5
6
<intent-filter>
<!-- 加入这个标签的Activity,将会成为所有启动入口进入的页面 -->
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

  如果给另一个Activity也设置为默认启动页面,那么又将以注册启动入口的先后顺序来决桌面图标启动进入的页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<!-- 如果不重新添加label和icon,将会使用application中定义的对应值 -->
<activity
android:label="@string/app_name2"
android:icon="@drawable/app_icon2"
android:name=".SplashActivity"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

  若要使两个启动图标打开不同的启动页面,需要给两个Activity定义不同的process属性,使两个Activity运行在不同的进程中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:theme="@style/AppTheme">

<!-- 该图标启动main进程 -->
<activity
android:name=".MainActivity"
android:process=":process.main"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<!-- 该图标启动splash进程 -->
<activity
android:label="@string/app_name2"
android:icon="@drawable/app_icon2"
android:name=".SplashActivity"
android:process=":process.splash"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

  为Activity指定process属性后,还要为其指定单例运行模式,将launchMode设置为singleInstance

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/app_icon"
android:theme="@style/AppTheme">

<!-- 该图标启动main进程 -->
<activity
android:name=".MainActivity"
android:process=":process.main"
android:launchMode="singleInstance"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<!-- 该图标启动splash进程 -->
<activity
android:label="@string/app_name2"
android:icon="@drawable/app_icon2"
android:name=".SplashActivity"
android:process=":process.splash"
android:launchMode="singleInstance"
android:exported="true" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>

  全部设置完毕后,此时该应用的两个图标将进入两个不同的Activity
  需要注意的是,多个进程会创建多个Application对象,执行多次OnCreate方法