Android应用设置多个启动图标,动态列换应用图标

Android开发三年了,今天才知道,可以给一个应用设置多个应用图标(启动图标),可以在程序中动态更换应用图标,作为一枚有三年工作经验的程序猿,今天才知道这事,被严重鄙视了。

下面就来说说如何给一个应用设置多个应用图标?

1. 如何给一个应用设置多个入口,在launcher桌面上存在多个启动图标?

我们知道,设置一个应用的入口Activity,只需要在AndroidMainfest.xml文件中,在注册activity的节点下添加intent-filter,并设置action属性为acion.MAIN, category属性为category.LAUNCHER,应用就会将此activity作为应用程序的入口。

 <activity android:name=".TestInputActivity"
            android:windowSoftInputMode="adjustResize"
            android:icon="@mipmap/f_homepage_affari_notice_icon"
            android:label="TestInputActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这样该Activity就为应用程序的入口Activity,点击应用图标首次进入的界面。

在该activity标签下可以设置android:icon作为应用的图标, 设置android:label作为应用名称,如果没有设置启动Activity的icon和label属性,会默认使用application节点下icon和label属性中设置的应用图标和应用名称。

如果一个应用设置多个Activity的intent-filter属性下的action为action.MAIN, category属性为category.LAUNCHER,则应用就会在launcher的生成多个应用图标,每个应用名称分别是我们在activity标签下定义的Activity的android:label的值。

使用场景:我们的Android手机一般在launcher上存在联系人应用图标、拨号应用图标,其实这两个应用图标对应的是同一个应用,只是设置了两个入口,进入不同的Tab页面。

2. 如何动态给应用更换图标

比如我们过春节时,会发现微博或是淘宝等应用会更换应用图标,如何在应用不重新发包的情况下,对应用图标进行更换呢?

我们可以通过以下两种方法来实现,其实原理是类似的。

2.1 方法一:根据开启或关闭组件进行更换应用图标

我们可以事先在AndroidMainfest.xml文件中定义多个应用的入口组件(启动图标),在代码运行时控制组件的显示与隐藏,从而达到更换应用图标目的。由于在每年春节或是双11时,一些商家可能需要列换应用图标,我们可以在程序中通过时间来控制应用图标更换目的。那如何控制组件的显示与隐藏呢。

在讲解更换应用图标之前,我们先来了解下Android中如何禁用一个组件。

2.1.1 如何关闭一个组件?

(1)关闭组件的使用场景

在用到组件时,有时候我们可能暂时性的不使用组件,但又不想把组件kill掉,比如创建了一个broadcastReceiver广播监听器,用来监听第一次开机启动后获得系统的许多相关信息,并保存在文件中,这样以后每次开机启动就不需要再去启动该服务了,也就是说如果没有把receiver关闭掉,就算是不做数据处理,但程序却还一直在后台运行会消耗电量和内存,这时候就需要把这个receiver给关闭掉。

(2)如何关闭组件?

关闭组件其实并不难,只要创建packageManager对象和ComponentName对象,并调用packageManager对象的setComponentEnabledSetting方法。

public void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)

componentName:组件名称

newState:组件新的状态,可以设置三个值,分别是如下:

  • 不可用状态:COMPONENT_ENABLED_STATE_DISABLED
  • 可用状态:COMPONENT_ENABLED_STATE_ENABLED
  • 默认状态:COMPONENT_ENABLED_STATE_DEFAULT

flags:行为标签,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app

public int getComponentEnabledSetting(ComponentName componentName)//获取组件的状态

2.1.2 通过关闭组件或是开启组件来达到应用图标列换目的

通过下面的方法,通过设置组件的状态,我们可以达到隐藏或是显示一个应用图标,从而达到更换应用图标的目的。

private void hideTest2() {
        PackageManager packageManager = getPackageManager();
        ComponentName componentName = new ComponentName(this, Test2Activtiy.class);
        int res = packageManager.getComponentEnabledSetting(componentName);
        if (res == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
                || res == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
            // 隐藏应用图标
            packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
        } else {
            // 显示应用图标
            packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
                    PackageManager.DONT_KILL_APP);
        }
    }

2.2 方法二:根据activity-alias来设置桌面可以存在多个icon,再设置某个activity-alias显示其他隐藏

2.2.1 在xml添加多个activity-alias、删除应用首次进入activity标签的category属性

<activity-alias
    android:name=".icon_tag"
    android:enabled="true"
    android:icon="your icon"
    android:label="your label"
    android:targetActivity=".activity.WeChatLoginActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>  

<activity-alias
    android:name=".icon_tag_1212"
    android:enabled="false"
    android:icon="your icon"
    android:label="your label"
    android:targetActivity=".activity.WeChatLoginActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>  

2.2.2 在代码中控制活动和普通图标的切换

/**
 * @param useCode =1、为活动图标 =2 为用普通图标 =3、不启用判断
 */
private void switchIcon(int useCode) {  

    try {
        //要跟manifest的activity-alias 的name保持一致
        String icon_tag = "com.weechan.shidexianapp.icon_tag";
        String icon_tag_1212 = "com.weechan.shidexianapp.icon_tag_1212";  

        if (useCode != 3) {  

            PackageManager pm = getPackageManager();  

            ComponentName normalComponentName = new ComponentName(
                    getBaseContext(),
                    icon_tag);
            //正常图标新状态
            int normalNewState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                    : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            if (pm.getComponentEnabledSetting(normalComponentName) != normalNewState) {//新状态跟当前状态不一样才执行
                pm.setComponentEnabledSetting(
                        normalComponentName,
                        normalNewState,
                        PackageManager.DONT_KILL_APP);
            }  

            ComponentName actComponentName = new ComponentName(
                    getBaseContext(),
                    icon_tag_1212);
            //正常图标新状态
            int actNewState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                    : PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            if (pm.getComponentEnabledSetting(actComponentName) != actNewState) {//新状态跟当前状态不一样才执行  

                pm.setComponentEnabledSetting(
                        actComponentName,
                        actNewState,
                        PackageManager.DONT_KILL_APP);
            }  

        }
    } catch (Exception e) {
    }
}  

**总结:给应用设置多个启动图标,并不是什么难的知识点,但咱们平时都没有关注过,有时觉得还有点不可思议,不自觉想起毛主席的那句话“一切困难都是纸老虎”,哈哈。

还有如何关闭一个组件,通过packageManager对象的setComponentEnabledSetting方法设置ComponentStatus状态即可,通过它就可以动态更换应用图标。

当然以下两种方法都需要咱们先预先在应用的AndroidMainfest.xml中设置好相应的标签,设置启动模式,设置相应的图标。如果想要应用动态换成任意图标,则还是需要升级应用。

时间: 2024-10-07 03:35:50

Android应用设置多个启动图标,动态列换应用图标的相关文章

Android 监听开机广播启动服务 动态注册时间变化监听广播

开机广播权限 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 开机广播 注册 <receiver android:name="com.stone.receiver.BootedReceiver"> <intent-filter> <action android:name="android.intent.acti

Android程序设置软件图标

默认新建的工程里会设置一个系统默认图标 如果没有,就在工程的AndroidManifest.xml文件中添加下面的语句即可. 这里需要预先在/res/drawable/目录下放一个叫icon.png的图标图片(48×48),并且在/res/values/strings.xml中定义app_name这个字符串(就是程序名) <application android:icon="@drawable/icon" android:label="@string/app_name&

Android 编程之天气预报闹钟启动服务设置界面加载--4

真个application讲的已经差不多了,在说完这一篇之后,我会上传源码到资源,喜欢的可以下载和学习,今天主讲闹钟启动设置,设置页面的加载 在Android系统中,闹钟和唤醒功能都是由Alarm Manager Service控制并管理的.我们所熟悉的RTC闹钟以及定时器都和它有莫大的关系.为了便于称呼,我常常也把这个service简称为ALMS.         另外,ALMS还提供了一个AlarmManager辅助类.在实际的代码中,应用程序一般都是通过这个辅助类来和ALMS打交道的.就代

Android从一个应用启动另一个主界面隐藏图标的应用

用a.apk启动b.apk,并且b的图标是在手机主界面上看不到的. 一.新建a,b两个android项目(新建helloworld项目相似),在a项目中增加点击事件(启动按钮来启动b应用).      二.在b应用中修改b manifest.xml中<intent-filter>...</intent-filter>的内容就可以隐藏b应用的图标了. <?xml version="1.0" encoding="utf-8"?> &l

【Android】Mac下Android Studio设置App启动页

先将启动页放到项目资源中,图片一般是1080*1920的jpg. 新建一个activity,如图: 创建成功之后,打开刚刚创建的activity,来进行代码的编写: public class BZLaunchActivity extends AppCompatActivity { private final int SPLASH_DISPLAY_LENGHT = 2000;//两秒后进入系统,时间可自行调整 @Override protected void onCreate(Bundle sav

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

Android ART 的初始化和启动

ART的初始化 下面我们从JNI_GetDefaultJavaVMInitArgs(),JNI_CreateJavaVM()和JNI_GetCreatedJavaVMs()三个函数入手来了解ART的初始化过程.这三个函数的代码位于jni_internal.cc中. JNI_GetDefaultJavaVMInitArgs()函数在ART中没有作为,只是返回JNI_ERR.如下所示: extern "C" jintJNI_GetDefaultJavaVMInitArgs(void* )

[Android Pro] Android权限设置android.permission完整列表

android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问"properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION允许一个程序访问Cel

android在JNI_OnLoad入口函数下断点动态调试so库

一般来说,很多APK的校验代码,都会在程序运行的时候自动加载一些动态so库,然后执行这些库中的校验代码.所以为了能够通过程序的校验,我们必须在执行这些函数之前下断点--理想的方法就是在JNI_OnLoad入口函数下断点. 在2.3.3模拟器中详细步骤如下: ①在控制台输入adb shell 进入手机,然后使用  am start -D -n 包名/类名,以等待调试的模式启动APK应用: 这里需要说明的是 "包名/类名"的书写方法: # am start -n {包(package)名}