某些情况下,我们需要为我们的apk设置多个执行入口,也就是安装后在应用程序列表中出现多个ICON图标,各个ICON是APP不同模块的入口点。有一个现实的例子:系统中的联系人和电话这两个程序(如下图所示)

现在越来越多的应用也具备这样的设置,比如百度应用(百度应用+应用管理),腾讯应用宝等。
下面我们来总结一下网上流传广泛的3种实现方式。
下面我们来总结一下网上流传广泛的3种实现方式。
实现方式1
:
intent-filter
给相应的
Activity增加
intent-filter
<ativity android:name=
"A2"
android:label=
"@string/app_name2"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
|
实现方式
2:
process属性
Activity有一个重要的属性
process,这个属性是指定
Activity运行时所在的进程。没有指定此属性的话,所有程序组件运行在应用程序默认的进程中,这个进程名跟应用程序的包名一致。中所有组建元素的
process属性能够为该组件设定一个新的默认值。但是任何组件都可以覆盖这个默认值,允许你将你的程序放在多进程中运行。如果这个属性被分配的名字以
:开头,当这个
activity运行时
,一个新的专属于这个程序的进程将会被创建。
实现如下:
<activity android:name=
".A1"
android:label=
"@string/app_name"
android:process=
":process.main"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name=
".A2"
android:label=
"@string/app_name2"
android:process=
":process.sub"
android:icon=
"@drawable/icon2"
android:launchMode =
"singleInstance"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
|
实现方式
3:
activity-alias
alias => 别名
实现如下:
<activity-alias
android:name=
"A3"
android:icon=
"@drawable/icon2"
android:label=
"@string/app_name2"
android:targetActivity=
".A2"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity-alias>
|
这里targetActivity作用是让A3与A2公用一个界面,也就是给A2起了个“小名”叫A3,A2在Manifest.xml中只是一个正常注册的Activity,但是A3却在桌面上有一个程序图标,单击图标可以进入A2了。完整的Manifest.xml如下:
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android"
package
=
"com.wang.multiicon"
android:versionCode=
"1"
android:versionName=
"1.0"
>
<uses-sdk android:minSdkVersion=
"10"
/>
<application
android:icon=
"@drawable/ic_launcher"
android:label=
"@string/app_name"
>
<activity
android:name=
".A1"
android:icon=
"@drawable/ic_launcher_contacts"
android:label=
"@string/app_name"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity
android:name=
".A2"
android:label=
"@string/app_name2"
>
</activity>
<activity-alias
android:name=
"A3"
android:icon=
"@drawable/ic_launcher_phone"
android:label=
"@string/app_name2"
android:targetActivity=
".A2"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity-alias>
</application>
</manifest>
|
需要说明的一点:系统Contacts应用就是使用第三种方式实现的多程序入口的。
总结:上面三种实现方式其实原理都是一样的,都是为第二个Activity添加
"<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />"
intent-filter为程序增加入口图标。
第三种实现方式的源码:http://files.cnblogs.com/feifei1010/MultiIconDemo.zip
参考资料:
本文介绍了在Android应用中实现多个启动图标的方法,包括通过intent-filter、process属性及activity-alias三种方式,并提供了具体实例。
284

被折叠的 条评论
为什么被折叠?



