揭秘双十一手机淘宝图标如何被动态更换

目录
  • 1、Android如何动态更换桌面图标
    • 1.1使用场景
    • 1.2知识点
    • 1.3使用Activity-alias
  • 2、巨坑
    • 2.1App的覆盖
    • 2.2桌面上出现两个图标的问题
    • 2.3桌面上图标消失的问题
    • 2.4总结
    • 2.5最终方案(方案一)

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"的不要设置为多个,否则会出现多个图标,如果试图通过代码进行隐藏其中的一个或者几个,可能会出现图标消失的情况。

到此这篇关于揭秘双十一手机淘宝图标如何被动态更换的文章就介绍到这了,更多相关动态更换手机图标内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android用RecyclerView实现图标拖拽排序以及增删管理

    1. 效果图 2. 基本的功能 在非编辑状态下可以直接点击图标进行跳转 在编辑状态可以拖拽.添加.删除操作 已被添加过的不能再次添加 3. 实现的思路 用两个RecyclerView实现,同时维护两个数据源,上部是常用应用,最多可以放8个:下部是全部应用. 1. 每个应用图标的状态用枚举Option表示 // 当前的操作状态 enum class Option { ADD, REMOVE, NONE } 2. 在处于编辑状态时创建ItemTouchHelper对象并attch到RecyclerV

  • Android 登录页面的实现代码(密码显示隐藏、EditText 图标切换、限制输入长度)

    效果演示 密码显示与隐藏 方法一 if(status){ etPassword.setInputType(InputType.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_NORMAL); //显示文本 status = false; }else { etPassword.setInputType(InputType.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD); //隐藏

  • android10 隐藏SystemUI锁屏下的多用户图标的示例代码

    需求:如上图,需要隐藏右上角的多用户蓝色图标. 修改后结果如下: 锁屏相关的布局在SystemUI frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java //更新多用户图标的可见性 private void updateVisibilities() { if (mMultiUserSwitch.getParent() != mStatusIconA

  • Flutter开发之设置应用名称及图标的教程

    最近在用Flutter开发App项目,一切都是新的,一切都要学习.不过经过一段时间的开发适应和磨合,趋于稳定状态.本篇博文来分享一下Flutter设置App的应用名字和应用logo图标的方法,知识点虽然简单,但是不知道这个知识点就不行,所以还是要记录下来,分享一下. 其实,Flutter设置App的应用名称和图标是要分开来操作的,Android和iOS是分开设置对应的App名称和图标的,这一点一定要注意.也可以把Android和iOS的应用名称和图标分开设置,可以设置不一样,但是毕竟一个App为

  • AndroidStudio替换项目图标ic_launcher操作

    1.打开项目主界面,任意打开一个类文件,如MainActivity.java,不要打开布局文件的disign界面 2.点击File-->New-->Image Asset,如图: 3.选择要替换的图标 4.选好之后点击ok 5.点击Next 6.点击finish 7.另外,如果你重新运行之后图标没有变化,不用着急,现在智能手机基本上都是桌面和应用同时控制着图标的显示,两者一起改,桌面图标才会变化,而桌面图标是有缓存的,应用改了之后,桌面依然控制着显示原来的图标,清除桌面数据再试试,基本上就能看

  • Android控件View的文字周围添加图标

    在Android控件View的文字周围添加图标,供大家参考,具体内容如下 在控件TextView文字周围放置图片(基于TextView的Button也能实现),减少多布局组合嵌套. 优点:使用LinearLayout对ImageView和TextView组合布局固然可行, 但是布局文件会冗长许多. 以TextView为例: 在XML布局文件中设置以下5个属性: drawableTop: 指定文本上方的图形. drawableBottom: 指定文本下方的图形. drawableLeft: 指定文

  • 揭秘双十一手机淘宝图标如何被动态更换

    目录 1.Android如何动态更换桌面图标 1.1使用场景 1.2知识点 1.3使用Activity-alias 2.巨坑 2.1App的覆盖 2.2桌面上出现两个图标的问题 2.3桌面上图标消失的问题 2.4总结 2.5最终方案(方案一) 1.Android如何动态更换桌面图标 1.1使用场景 APP,在中国电商行业中,某宝和某东是行业的标杆.其中有一点挺让人好奇的,那就是在双十一临近之时,他们的APP桌面图标突然变成了带有双十一字样的图标.可能就是本来就内置了双十一的图标,等快到双十一的时

  • Android中利用动态加载实现手机淘宝的节日特效

    相信去年圣诞节打开过手机淘宝的童鞋都会对当时的特效记忆犹新吧:全屏飘雪,旁边还有个小雪人来控制八音盒背景音乐的播放,让人有种身临其境的感觉,甚至忍不住想狠狠购物了呢(误),大概就是下面这个样子滴: 嗯,确实很炫,那么我们一步步去分析是如何实现的: 一.实现下雪的 View 首先,最上面一层的全屏雪花极有可能是一个顶层的View,而这个View是通过动态加载去控制显示的(不更新淘宝也能看到这个效果).那么我们先得实现雪花效果的 View,人生苦短,拿来就用.打开 gank.io,搜索"雪花&quo

  • iOS应用内实现跳转到手机淘宝天猫的方法

    前言 平常我们做iOS开发,会经常遇到打开其他的APP的功能.本文主要介绍了关于iOS实现应用内跳转到手机淘宝天猫的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. info.plist 中需要添加(实测没填写的话不会去判断是否安装了此APP) 代码如下: 需要跳转的按钮点击事件: func copyStrKey(_ sender: UIButton) { let pboard = UIPasteboard.general pboard.string = self.pr

  • Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能

    Android开发实现打开手机淘宝,并自动识别淘口令,弹出商品信息,大家都遇到过被莫名其妙拉进一个微信群,然后群主开始发一些商品的链接,我们点击这个链接,会让我们复制一个口令(就像这个¥AzZK0hPyou5¥),当我们复制这个口令打开淘宝会自动弹出这个商品的信息.今天,就来和大家分享一下,这个需求是如何实现的. 1.首先我们需要后台帮助我们对接淘宝的商品接口,因为这个东西(¥AzZK0hPyou5¥)是淘宝提供的,我们要做的只是通过网络请求我们的后台,把这个口令拿到就行,至于后台是如何调用淘宝

  • Android实现淘宝底部图标导航栏

    在上一篇中,简单的使用透明主题的Activity实现了仿微信右侧顶部的对话框,上午又花了两个小时研究了一下淘宝底部的导航栏实现,网上的做法也有很多,今天我就使用一种通过基本控件加上布局的方式,没有任何的自定义风格,控件等来实现,还是老样子,先看一下效果图: 下面就来具体看一看如何实现的,还是按照步骤来吧: 绘制主界面 activity_layout.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <R

  • 2020淘宝618理想生活列车自动领喵币js脚本的代码

    自动收喵币 脚本 //by 丈二 //auto.waitFor(); var height = device.height; var width = device.width; var my_taobao = desc("我的淘宝"); var task_door = desc("瓜分10亿"); var task_list = text("做任务,领喵币"); function appRun() { var version = device.r

  • 新手学习前端之js模仿淘宝主页网站

    先给大家展示下效果图: 图片资源链接:http://pan.baidu.com/s/1jHAdLNg 密码:5uo1 html 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href=&quo

  • Android仿美团淘宝实现多级下拉列表菜单功能

    我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单.具体如图所示: 上面两张图就是美团的一个二级列表菜单的一个展示.我相信很多人都想开发一个跟它一样的功能放到自己的APP中.好,接下来我们就开始动手,解决它. 1.结构分析 首先,我们给出这个下拉菜单需要的组建.我们用线框图来分析. 1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的"美食,全城,理我最近,刷选&

  • Android仿淘宝商品浏览界面图片滚动效果

    用手机淘宝浏览商品详情时,商品图片是放在后面的,在第一个ScrollView滚动到最底下时会有提示,继续拖动才能浏览图片.仿照这个效果写一个出来并不难,只要定义一个Layout管理两个ScrollView就行了,当第一个ScrollView滑到底部时,再次向上滑动进入第二个ScrollView.效果如下: 需要注意的地方是: 1.如果是手动滑到底部需要再次按下才能继续往下滑,自动滚动到底部则不需要 2.在由上一个ScrollView滑动到下一个ScrollView的过程中多只手指相继拖动也不会导

  • Android打开淘宝客户端(手淘)效果及实现代码

    隐式调用的方法就不讲了,如果安装了手淘的SDK或阿里百川之类的东西请参考官方文档,有了文档这些都不是问题. 一.应用内打开 应用内部调用淘宝,当展示"最近运行的应用"时只会显示一个应用,前提是安装了淘宝客户端. 效果图: 首先判断应用是否安装: private boolean isAppInstalled(Context context, String uri) { PackageManager pm = context.getPackageManager(); boolean ins

随机推荐