精华内容
下载资源
问答
  • Android之动态更换桌面图标

    万次阅读 2017-04-04 00:13:32
    Android之动态更换桌面图标文章链接知识点 动态更换APP 桌面icon的引述; activity组件及定义“同盟”组件activity-alias; PackageManager类进行启用/禁用组件; PackageInfo的简介; 新名词记录{PackageInfo:...

    Android之动态更换桌面图标

    文章链接:http://blog.csdn.net/qq_16628781/article/details/69054325

    知识点

    1. 动态更换APP 桌面icon的引述;
    2. activity组件及定义“同盟”组件activity-alias;
    3. PackageManager类进行启用/禁用组件;
    4. PackageInfo的简介;
    5. 新名词记录{PackageInfo:Androidmanifest.xml文件描述类}

    概述

    APP,在中国电商行业中,某宝和某东是行业的标杆。其中有一点挺让人好奇的,那就是在双十一临近之时,他们的APP桌面图标突然变成了带有双十一字样的图标。但是明明记得那段时间并没有更新过,那么唯一的可能就是本来就内置了双十一的图标,等快到双十一的时候在动态更换,然后过了双十一那段时间,又将APP的桌面图标变成普通的icon。

    既然图标本来就在APP里头(或者是网络下载下来的,只是猜测,有知道的小伙伴可以给我留言),那么就很好奇了,它们的图标到底是怎么样进行动态的更换的呢?


    探索1

    对于Android来说,所有的activity都是一个组件,我们可以对每个组件进行管理。
    关于程序的入口,我们知道android.intent.action.MAIN进行的指定的。

    
    <activity
                android:name=".HomeActivity"
                android:label="@string/app_name"
                android:theme="@style/AppThemeToolbar">
                <intent-filter>
                    //指定应用程序最先启动的Activity
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

    对于android.intent.category.LAUNCHER,这个又是设置什么的呢?这个是决定应用程序是否显示在程序列表里头。

    另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口。用法如下所示:

    <activity
                android:name=".HomeActivity"
                android:label="@string/app_name"
                android:theme="@style/AppThemeToolbar">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <!--name:组件名字-->
            <!--enabled:该组件是否启动-->
            <!--icon:组件图标-->
            <!--label:组件标签说明-->
            <!--targetActivity:组件的类-->
            <activity-alias
                android:name=".HomeActivity2"
                android:enabled="false"
                android:icon="@drawable/icon2"
                android:label="icon2"
                android:targetActivity=".HomeActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity-alias>
            <activity-alias
                android:name=".HomeActivity3"
                android:enabled="false"
                android:icon="@drawable/icon3"
                android:label="icon3"
                android:targetActivity=".HomeActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity-alias>

    如上面代码显示,这里有3个程序的入口,其中第二和第三个是被禁用掉的,如果enable缺省值,那么默认是true。既然可以XML中禁用,那么对应的也可以在代码中启动组件了。

    探索2

    APP的icon是对于整个包范围的,既然是要动用到APP包,那么是不是系统就给我们提供了一个管理整个包的类呢?事实上,系统给我们提供了PackageManager这个类,这个类能够获取到当前应用里不同类型的信息。定义了一系列比如的服务的字段常量,低功耗ble蓝牙,相机==,以及一系列有关包操作的抽象方法。此类可以管理所有的系统组件。

    我们知道APP上每一个对象都是系统里的一个组件,那么我们可以在PackageManager类里面看到有关于组件的操作方法;

    这个方法有以下比较重要的方法:

    //设置特定组件是否可以启动方法
    public abstract void setComponentEnabledSetting(ComponentName componentName,  int newState, int flags);
    //相反,得到特定组件是否启动的方法
    public abstract int getComponentEnabledSetting(ComponentName componentName);

    参数1:组件的名称;

    参数2:组件新的状态;

    参数3:标志是否要killapp;

    有了以上两个方法,我们就可以根据给定不同的组件名称+状态进行设置是否可用了。结合探索1里面定义的3个组件的启动和禁止情况,我们可以进行对应的enable操作。

    结合使用

    private PackageManager mPackageManager;
        //默认组件
        private ComponentName componentNameDefault;
        private ComponentName componentName2;
        private ComponentName componentName3;
    
        /**
         * 设置第icon2图标生效
         */
        private void enableComponentName2() {
            disableComponent(componentNameDefault);
            disableComponent(componentName3);
            enableComponent(componentName2);
        }
    
        /**
         * 设置第icon3图标生效
         */
        private void enableComponentName3() {
            disableComponent(componentNameDefault);
            disableComponent(componentName2);
            enableComponent(componentName3);
        }
    
        /**
         * 启动组件
         *
         * @param componentName 组件名
         */
        private void enableComponent(ComponentName componentName) {
            //此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性
            mPackageManager.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);
        }
    
        /**
         * 禁用组件
         *
         * @param componentName 组件名
         */
        private void disableComponent(ComponentName componentName) {
            mPackageManager.setComponentEnabledSetting(componentName,
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
        }
    
        //最后调用
        public void pmTest() {
            //获取到包管理类实例
            mPackageManager = getPackageManager();
            //得到此activity的全限定名
            componentNameDefault = getComponentName();
            //根据全限定名创建一个组件,即activity-alias 节点下的name:HomeActivity2 对应的组件
            componentName2 = new ComponentName(getBaseContext(), "com.yaojt.HomeActivity2");
            componentName3 = new ComponentName(getBaseContext(), "com.yaojt.HomeActivity3");
            String action = getActionFromServer();//从后台获取到应该使用那一个组件,或者根据时间来判断
            if ("comp2".equals(action)){
                enableComponentName2();
            }else if ("comp3".equals(action)){
                enableComponentName3();
            }
            //如果没有,则显示默认图标
        }

    通过以上的代码,可以清楚的看到,如何获取已经在XML文件里面定义好的组件。然后根据不同需求,来启用或者禁止对应的组件,从而达到更新APP桌面图标的功能。(可能需要一段时间刷新,才能看到新的APP桌面图标)


    课外知识

    PackageInfo:装载Androidmanifest.xml文件所有信息的类。

    所有的信息都来自AndroidManifest.xml文件;例如,包名packageName、版本号versionCode、sharedUserId共享id、apk第一次和最后一次安装时间、声明的activity,service、receiver、provider和请求的权限等等的信息。


    总结

    以上就是其中一种动态桌面更换图标的方法,需要的是预先放入需要更换的icon进去,或许还可以支持动态的设置icon,但是这部分我还没有仔细的去研究。如果你知道,请留言告知我,大家共同学习进步。

    如有任何问题,请及时与我联系。谢谢

    展开全文
  • 1、Android如何动态更换桌面图标 1.1使用场景  APP,在中国电商行业中,某宝和某东是行业的标杆。其中有一点挺让人好奇的,那就是在双十一临近之时,他们的APP桌面图标突然变成了带有双十一字样的图标。可能就是...

    1、Android如何动态更换桌面图标

    1.1使用场景

          APP,在中国电商行业中,某宝和某东是行业的标杆。其中有一点挺让人好奇的,那就是在双十一临近之时,他们的APP桌面图标突然变成了带有双十一字样的图标。可能就是本来就内置了双十一的图标,等快到双十一的时候在动态更换,然后过了双十一那段时间,又将APP的桌面图标变成普通的icon。

    1.2知识点

          动态更换APP 桌面icon的引述;
          activity组件及定义“同盟”组件activity-alias;
          PackageManager类进行启用/禁用组件;
          PackageInfo的简介;
          新名词记录{PackageInfo:Androidmanifest.xml文件描述类}

    1.3使用Activity-alias

    <activity
        android:name="com.aliasicon.MainActivity"
        android:enabled="false"
        android:exported="true"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    
    
    <activity-alias
        android:name="com.zztzt.android.simple.activity.tztCommHeadPageGenearlActivity"
        android:configChanges="orientation|keyboardHidden|fontScale|screenSize"
        android:enabled="true"
        android:exported="true"
        android:icon="@drawable/tzt_icon"
        android:label="@string/app_general_name"
        android:screenOrientation="portrait"
        android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
    
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>
    <activity-alias
        android:name="com.zztzt.android.simple.activity.tztCommHeadPageLicaiActivity"
        android:configChanges="orientation|keyboardHidden|fontScale|screenSize"
        android:enabled="false"
        android:exported="true"
        android:icon="@drawable/tzt_icon_licai"
        android:label="@string/app_licai_name"
        android:screenOrientation="portrait"
        android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
    
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>
    String systemPath = "com.aliasicon.MainActivity";
    String springPath = "com.zztzt.android.simple.activity.tztCommHeadPageAliasActivity";
    String licaiPath = "com.zztzt.android.simple.activity.tztCommHeadPageLicaiActivity";
    String genearlPath = "com.zztzt.android.simple.activity.tztCommHeadPageGenearlActivity";
    String finalPath = "";
    ComponentName genearlComponent;
    ComponentName licaiComponent;
    ComponentName springComponent;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        genearlComponent = new ComponentName(getApplication(), genearlPath);
        licaiComponent = new ComponentName(getApplication(), licaiPath);
        springComponent = new ComponentName(getApplication(), springPath);
    
    	//第一个默认按钮
        Button btnDefault = (Button) findViewById(R.id.tztToDefault);
        btnDefault.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                disableComponent(MainActivity.this, licaiComponent);
                disableComponent(MainActivity.this, springComponent);
                enableComponent(MainActivity.this, genearlComponent);
            }
        });
        //理财按钮
        Button btnLiCai = (Button) findViewById(R.id.tztToLiCai);
        btnLiCai.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                disableComponent(MainActivity.this, genearlComponent);
                disableComponent(MainActivity.this, springComponent);
                enableComponent(MainActivity.this, licaiComponent);
            }
        });
        //春节按钮
        Button btnSpring = (Button) findViewById(R.id.tztToSpring);
        btnSpring.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                disableComponent(MainActivity.this, genearlComponent);
                disableComponent(MainActivity.this, licaiComponent);
                enableComponent(MainActivity.this, springComponent);
            }
        });
    }
    
    /**
     * 启用组件 * 
     * @param componentName
     * 重要方法
     */
    private void enableComponent(Activity activity, ComponentName componentName) {
        PackageManager pm = activity.getPackageManager();
        int state = pm.getComponentEnabledSetting(componentName);
        if (PackageManager.COMPONENT_ENABLED_STATE_ENABLED == state) {
            //已经启用
            return;
        }
        pm.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }
    
    /**
     * 禁用组件 * 
     * @param componentName
     * 重要方法
     */
    private void disableComponent(Activity activity, ComponentName componentName) {
        PackageManager pm = activity.getPackageManager();
        int state = pm.getComponentEnabledSetting(componentName);
        if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED == state) {
            //已经禁用
            return;
        }
        pm.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }
    
    public void saveData(String savePath) {
        SharedPreferences sp = getSharedPreferences("Icon", Context.MODE_PRIVATE);
        //获取到edit对象
        SharedPreferences.Editor edit = sp.edit();
        //通过editor对象写入数据
        edit.putString("Value", savePath);
        //提交数据存入到xml文件中
        edit.commit();
    }
    
    public String getData() {
        SharedPreferences sp = getSharedPreferences("Icon", Context.MODE_PRIVATE);
        return sp.getString("Value", "");
    }
    

     

    2、巨坑

          通过上面的程序能够实现却换图标;如果代码里通过节假日的时间进行控制,则客户打开app会自动的切换图标;

          是不是很神奇?先别高兴太早。

    2.1App的覆盖

          任何App都会更新,进行覆盖安装。覆盖安装的Manifest的配置不当导致出现难以挽回的问题。

          1、从上面的xml里配置可见,一个Activity和两个Activity-alisa的配置情况:

                Activity的android:enabled="false"
                第一个Activity-alias的android:enabled="true"
                第二个Activity-alias的android:enabled="false"

                所以App打开,桌面上默认的就是使用第一个Activity-alias的名字和图标。

          2、如果新版本的配置还是按照这个配置(即使添加了新的alias,只要默认的Activity-alias不发生变化)客户端额升级覆盖安装,是不会出现错误的。

          3、我们称之为“方案一”

    2.2桌面上出现两个图标的问题

          1、如果新版本把Activity的enable设置为true(方案二),则桌面上除了原来的Activity-alias图标之外,还拥有了该Activity的图标,即有了两个图标;

          Activity的android:enabled="true"
          第一个Activity-alias的android:enabled="false"
          第二个Activity-alias的android:enabled="false"

          3、如果试图使用使用上面的代码里的disableComponent方法或者android:enabled="false"隐藏显示的Activity-alias图标,则导致两个图标都消失;

    2.3桌面上图标消失的问题

          1、方案二会出现两个图标,如果再使用方案一进行覆盖,则两个图标都消失。

          2、如果再次使用方案二进行覆盖,则图标还是能重新显示出来的。

    2.4总结

          1、如果使用方案一进行覆盖安装,不管图标怎么动态的变换,再使用方案一进行覆盖安装,是正常的;

          2、如果使用方案二进行覆盖安装,不管配置的图标是什么样的,再使用方案二进行覆盖安装,也是正常的;

          3、如果使用方案一进行覆盖安装,如果图标没有动态切换的情况下,再使用方案二进行覆盖安装,也是正常的;

          4、如果使用方案一进行覆盖安装,如果图标已经经过动态切换的情况下,再使用方案二进行覆盖安装,会出现双图标的;

          5、如果使用方案一进行覆盖安装,如果图标已经经过动态切换的情况下,再使用方案二进行覆盖安装,会出现双图标的;如果在进行使用代码试图隐藏其中一个,则两个图标都消失;

          6、如果使用方案一进行覆盖安装,如果图标没有动态切换的情况下,再使用方案二进行覆盖安装,也是正常的,再使用方案一进行覆盖安装,也是正常的;

    2.5最终方案(方案一)

          采用方案一的方案,即通过代码动态变动图标,一定要注意以下事项:

          1、Activity的android:enabled="false"

                如果设置为true了,则会出现双图标;

          2、Activity-alias的android:enabled="true"的默认显示的项不要中途进行变动,如果确实需要使用新的默认值,则使用代码进行动态变换;

          3、Activity-alias的android:enabled="true"的不要设置为多个,否则会出现多个图标,如果试图通过代码进行隐藏其中的一个或者几个,可能会出现图标消失的情况。

    展开全文
  • win7替换桌面图标

    千次阅读 2014-04-23 16:56:55
    今天想把Eclipse的图标替换一下,就在网上下载了涂鸦风格图标素材,素材的截图: 素材下载地址(免积分):http://download.csdn.net/detail/zl544434558/7240429 更改步骤如下:在Eclipse的图标上右击 属性---...

       今天想把Eclipse的图标替换一下,就在网上下载了涂鸦风格图标素材,素材的截图:

    素材下载地址(免积分):http://download.csdn.net/detail/zl544434558/7240429

    更改步骤如下:在Eclipse的图标上右击  属性----更改图标---浏览(选择你刚才解压的文件夹里的任意文件)点击确定。即可。

    如图:

    展开全文
  • Android 更换桌面图标不生效问题解决

    千次阅读 2018-10-15 10:09:39
    今天应客户得要求把原来得项目桌面图标更换一下,结果发现替换并清空了项目中的所有老图标之后,桌面上依然显示得是老图标,Clean 项目也不起作用,最终 重新启动手机+clean 项目后桌面图标更新成功。...

    今天应客户得要求把原来得项目桌面图标更换一下,结果发现替换并清空了项目中的所有老图标之后,桌面上依然显示得是老图标,Clean 项目也不起作用,最终 重新启动手机+clean 项目后桌面图标更新成功。

    展开全文
  • Android 动态替换桌面图标

    千次阅读 2017-04-13 09:57:42
    现在淘宝,京东等App在节假日打开时,都是采用一套节假日的图标,这种不用发版本,又可以随着后台配置动态替换图标固然是很方便,体验很好的事情. 动态替换图标使用的是manifest文件配置入口别名activity-alias: ...
  • VB 生成的EXE怎么更换桌面图标

    千次阅读 2015-12-29 22:55:52
    首先 : ico要是32*32像素的 可以百度vb专用的图标 ...大多数人经过上面两步还是没改变桌面图标,可以看下面的方法: 在桌面上F5,或者把这个exe移动到别的目录后改个文件名再移回来就能显示新修改的图标了, 原因在于
  • Android MTK Launcher3 替换桌面图标

    千次阅读 2016-04-01 19:50:54
    packages\apps\Launcher3\src\com\android\launcher3\IconCache.java 获取应用程序的包名,给设置资源文件图标
  • Mtk Android 系统桌面图标替换

    千次阅读 2013-06-17 14:49:04
    Launcher程序第一次运行完毕以后,会在/data/data /...以后每次启动只会从这里读取桌面图标。 /packages/apps/Launcher/res/xml/default_workspace.xml 中记录了系统初始化或者恢复出厂设置时桌面上图标的排列。
  • 如何实现一键隐藏桌面图标,一键显示桌面图标。 如何实现一键隐藏桌面图标,一键显示桌面图标
  • 替换桌面快捷方式图标

    千次阅读 2017-07-20 11:59:56
    桌面快捷方式替换图标#include #include bool ChangeLinkIcon(const CString &strLnkName, const CString &strIconPath) { if (strLnkName.IsEmpty() || strIconPath.IsEmpty()) { return false; } ...
  • 隐藏桌面图标Android隐藏桌面图标,不显示应用图标隐藏桌面图标通过adb命令启动 效果预览: 如图所示,左图是默认安装app后,桌面上会显示一个应用图标。右图是增加隐藏桌面图标设置后安装的app,可以看到桌面上不会...
  • 苹果电脑隐藏桌面图标

    千次阅读 2019-10-24 21:52:08
    苹果电脑隐藏桌面图标 让电脑看起来更美观 隐藏桌面图标 defaults write com.apple.finder CreateDesktop false killall Finder 显示桌面图标 defaults write com.apple.finder CreateDesktop true killall Finder ...
  • ubuntu创建桌面图标

    千次阅读 2019-05-13 23:09:32
    Linux Qt创建桌面图标 安装完qt,发现没有桌面图标,写此文以作记录。 /usr/share/applications保存着桌面启动图标的信息 打开其中一个,例如sublime-text 新建一个qtcreator的文件,将里面的内容拷贝...
  • Windows桌面图标缓存

    千次阅读 2016-09-02 11:47:05
    今天碰到一个系统的缓存问题。 1、问题陈述: 有一个项目需要改变原先的所有图片,改变后,还改变了ico和icon文件。...不过,通过改变图标显示方式,把中图标改变成小图标或详细图标却是正确 的。
  • Electron 添加桌面图标

    千次阅读 2019-07-19 15:21:50
    Electron 添加桌面图标
  • win10系统桌面图标变为白色方框和去除桌面图标快捷方式小箭头的方法
  • web app 桌面图标

    千次阅读 2014-10-24 11:59:48
    桌面图标 在开发网站的过程中我们常常会设置一个 Touch Icon。由于系统的差异性,添加到桌面图标并没有统一的标准。iOS 最早支持 Touch Icon,并有明确的规范,其他系统一定程度上支持 iOS 的规范。 终极方案 ...
  • 桌面图标全是问号

    千次阅读 2014-04-23 08:58:28
    昨天在桌面上从svn上下载文件后,今天桌面图标全都是问号。 解决办法:将C:\Users\Administrator\Desktop 目录下的.svn目录删除即可。 如图:
  • 我的电脑--右点--属性--高级--性能--设置--自定义---桌面图标标签显示阴影前面打钩,如不能则去掉钩,应该总有一次可以解决的 4.桌面右键-属性-桌面-自定义桌面-Web-删掉除“当前主页”外的文件 5.右击桌面空白处,...
  • windows-xp桌面图标有蓝底怎么去掉:电脑桌面图标有蓝色阴影的解决办法。编者在上大学那会经常会在xp系统下出现电脑桌面图标有蓝色阴影的情况,当时总是费了很大的力气去到处找资料,最后解决多了问题也就简单了,这...
  • VC替换桌面IE图标[源码]

    千次阅读 2009-07-11 08:20:00
    1、先自己在网上找个IE的图标做资源 2、下面的代码目的是替换桌面上的IE图标,可以“忽悠”用户达到程序的运行权。咋的一看,IE一模一样,主页也没被修改,可双击打开的多了个你自己设定的网页,这样欺骗一下“普通...
  • 1.先准备好一张下载的图片,打开下面的网址进行抠图 ... 2.将抠图后的照片再经过 png 格式转换成 ico 格式 ...4.点击你想更换的桌面图标,右键属性,选择更改图标 5.选择 ico 图标的路径,点击确定 ...
  • 1、在设备首次启动完成后,待机桌面上已经预置了一些图标。这些图标是在首次开机后,Launcher 会从配置文件中读取预置图标的有效信息,存入数据库,然后读取数据库后进行加载预置图标。 2、参考 我写的“Launcher3...
  • ubuntu桌面图标消失

    千次阅读 2013-09-04 09:01:04
    ubuntu桌面图标消失,鼠标右键失效, 的解决办法     在可以使用的终端输入下来3条命令后重启即可: 1 sudo apt-get install -f 2 sudo apt-get update 3 sudo apt-get install ubuntu-...
  • steam桌面图标空白问题解决

    万次阅读 2020-12-29 21:44:06
    steam桌面图标空白问题解决 本文干货内容均来自原文在此,我只是做个记录总结,防止丢失。 问题原因:下载游戏的时候,由于种种原因,快捷方式图标没有实际下载到本地,但并不影响游戏本身。 解决思路:重新获取图标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 154,380
精华内容 61,752
关键字:

怎么换桌面图标