Android多启动图标实现

简介

有时候会存在特殊需求:当前的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>

运行之后可以看到桌面存在两个图标一摸一样的图标:

ssda

但是打开之后的界面确不一样:

152

dsf

目前为止,基本功能实现了。但是我们需要的是桌面显示不同的图标和名称。

由于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和名称,运行结果:

ds

可以看到,和样本的效果基本类似。同时发现一个小插曲,当我们在编译运行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的全称;

运行效果:

45

此时点击M有Test2跳转的依然是主界面。因为它的目标activity是主界面。

小结

虽然通过以上方式我们实现了应用程序多图标入口的功能,但是在系统的应用设置列表中,依然只有一个app进程。在桌面随便卸载哪一个图标,整个app都会被卸载。

其中的清单文件属性:

  • android.intent.category.LAUNCHER:官方解释为最上层的启动。
  • android.intent.action.MAIN:作为主要入口点,不需要接收数据。

这两个属性的区别个人觉得区分不大。

欢迎大家一起探讨。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,559评论 25 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,554评论 0 17
  • 有人说,挣来的钱只有花出去才是你的;也有人说钱还是存起来,以备不时之需;也有人说,会花钱的人才会挣钱。这几种说法,...
    烟雨程程阅读 277评论 0 0
  • 在这独特的撒狗粮日子里,单身狗们如果真的以为疾呼“没有秀恩爱就没有伤害”可以免去被虐,那真是过于天真烂漫了。 这两...
    大脸猫的自留地阅读 1,101评论 0 1
  • 八月五日晚八点二十五投诉了格力总部电话以后,在煎熬中总算超过了72小时,本不想在打投诉电话,但是根本没办法静下心来...
    乐了乐了乐了阅读 117评论 0 0