简介
有时候会存在特殊需求:当前的app不同的界面都需要设置为入口进行展示。但是Android系统默认只运行一个app存在一个应用启动图标。其实实现起来一点都不困难。
技术实现
方式一:通过设置属性进行实现多图标
根据官方api介绍,创建app的启动图标实在manifest文件中进行配置的。默认配置:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
...
其中在application中配置的icon即应用程序的启动图标icon,label字段就是应用程序情动图标的文字描述,而下面的activity中的intent filter节点就是设置启动图标的详情。目前的代码展示了当前MainActivity是启动界面,和普通界面的区别在于设置了category属性为LAUNCHER。
如果需要实现多个启动图标只需要在目标activity或者任一带有ui界面的组件设置intent-filter节点的catgegory属性值为LAUNCHER即可。测试代码:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".Main2Activity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
运行之后可以看到桌面存在两个图标一摸一样的图标:
但是打开之后的界面确不一样:
目前为止,基本功能实现了。但是我们需要的是桌面显示不同的图标和名称。
由于manifest文件是xml,即符合一般的xml解析规则,当子节点和父节点同时存在某一属性时,子节点属性会覆盖父节点属性。修改代码如下:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".Main2Activity"
android:icon="@drawable/ic01"
android:label="MyTest">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
修改了启动图标的icon和名称,运行结果:
可以看到,和样本的效果基本类似。同时发现一个小插曲,当我们在编译运行app时候,会默认打开一个界面。此时我们有两个主界面,怎么指定系统打开界面呢?
很简单,在intent-fiflter节点中添加如下代码即可:
<category android:name="android.intent.category.DEFAULT"/>
方式二:通过官方api实现多图标
官方api还提供另外一种实现方式:activity-alias 。这种方式是把同一个组件进行别名式操作,对象只有一个,增加了入口而已。
编写方式如下:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity-alias
android:name="TestAc"
android:targetActivity=".MainActivity"
android:label="MyTest2"
android:icon="@drawable/ic012">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
...
其中的必须字段为:
- name:设置目标activity的名称;
- targetActivity:目标activity的全称;
运行效果:
此时点击M有Test2跳转的依然是主界面。因为它的目标activity是主界面。
小结
虽然通过以上方式我们实现了应用程序多图标入口的功能,但是在系统的应用设置列表中,依然只有一个app进程。在桌面随便卸载哪一个图标,整个app都会被卸载。
其中的清单文件属性:
- android.intent.category.LAUNCHER:官方解释为最上层的启动。
- android.intent.action.MAIN:作为主要入口点,不需要接收数据。
这两个属性的区别个人觉得区分不大。
欢迎大家一起探讨。