Android 动态修改app图标

一款商业级的app,动态修改app图标,这是很常用的功能了,特别是电商类的,双11一个图标,双12一个图标。我们不可能为了修改一个图标而特意去发布一个新版本。

解决方案:
1、在manifest的设置多个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"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>


        <activity-alias
            android:name=".tag_11"
            android:label="双11"
            android:icon="@mipmap/ic_icon_11"
            android:enabled="false"
            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=".tag_12"
            android:label="双12"
            android:icon="@mipmap/ic_icon_12"
            android:enabled="false"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity-alias>

    </application>

applicatian中自带一个入口图标和名称,默认是启用的,所以只需要增加要修改的图标就行了,并设置android:enabled=”false” 暂不启用。

当特定时间到了,需要修改图标时:

public class MainActivity extends AppCompatActivity {

    private PackageManager mPackageManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPackageManager=getApplicationContext().getPackageManager();
        updateIcon();
    }

    //检查图标并更换
    public void updateIcon(){
        //获取当前的ComponentName 
        ComponentName currentName=getComponentName();

        if (isDouble11()&&!currentName.getClassName().equals("com.hellokiki.myapplication.tag_11")){
            ComponentName double11=new ComponentName(getBaseContext(),"com.hellokiki.myapplication.tag_11");
            disableComponent(currentName);
            enableComponent(double11);
            Log.e("2018","双11");
        }else if(isDouble12()&&!currentName.getClassName().equals("com.hellokiki.myapplication.tag_12")){
            ComponentName double12=new ComponentName(getBaseContext(),"com.hellokiki.myapplication.tag_12");
            disableComponent(currentName);
            enableComponent(double12);
            Log.e("2018","双12");
        }
    }

    //是否双11期间
    public boolean isDouble11(){
        Calendar calendar=Calendar.getInstance();
        calendar.set(2018,11-1,1);
        long startTime=calendar.getTime().getTime();
        calendar.set(2018,11-1,11);
        long endTime=calendar.getTime().getTime();
        long nowTime=System.currentTimeMillis();
        if(startTime<nowTime&&nowTime<endTime){
            return true;
        }
        return false;
    }

    //是否双12期间
    public boolean isDouble12(){
        Calendar calendar=Calendar.getInstance();
        calendar.set(2018,12-1,1);
        long startTime=calendar.getTime().getTime();
        calendar.set(2018,12-1,12);
        long endTime=calendar.getTime().getTime();
        long nowTime=System.currentTimeMillis();
        if(startTime<nowTime&&nowTime<endTime){
            return true;
        }
        return false;
    }

    //启用组件
    public void enableComponent(ComponentName componentName){
        mPackageManager.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
    }

    //隐藏组件
    public void disableComponent(ComponentName componentName){
        mPackageManager.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
    }

}

主要核心的就是:

 mPackageManager.setComponentEnabledSetting(componentName,
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);

//第二个参数,PackageManager.COMPONENT_ENABLED_STATE_DISABLED为隐藏,
//PackageManager.COMPONENT_ENABLED_STATE_ENABLED为启用

参考:

https://www.jianshu.com/p/eecfd9e0b878

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值