java icon动态变换_动态更换应用Icon

转:原理1——activity-alias

在AndroidMainifest中,有两个属性:

// 决定应用程序最先启动的Activity

android.intent.action.MAIN

// 决定应用程序是否显示在程序列表里

android.intent.category.LAUNCHER

另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口,相信做过系统Setting和Launcher开发的开发者在系统的源码中应该见过很多。

原理2——PM.setComponentEnabledSetting

PackageManager是一个大统领类,可以管理所有的系统组件,当然,如果Root了,你还可以管理其它App的所有组件,一些系统优化工具就是通过这个方式来禁用一些后台Service的。

使用方式异常简单:

private void enableComponent(ComponentName componentName) {

mPm.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

private void disableComponent(ComponentName componentName) {

mPm.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

}

根据PackageManager.COMPONENT_ENABLED_STATE_ENABLED和PackageManager.COMPONENT_ENABLED_STATE_DISABLED这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用。

动态换Icon

有了上面的两个原理,来实现动态更换Icon就只剩下思路问题了。

首先,我们创建一个Activity,作为默认的入口并带着默认的图片,再创建一个双11的activity-alias,指向默认的Activity并带有双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片……等等等。

android:name=".Test11"

android:enabled="false"

android:icon="@drawable/s11"

android:label="双11"

android:targetActivity=".MainActivity">

android:name=".Test12"

android:enabled="false"

android:icon="@drawable/s12"

android:label="双12"

android:targetActivity=".MainActivity">

等等,这样有个问题,那就是这样会在Launcher上显示3个入口,所以,默认我们会把这些activity-alias先禁用,等到要用的时候再启用,养兵千日,用兵一时。

public class MainActivity extends AppCompatActivity {

private ComponentName mDefault;

private ComponentName mDouble11;

private ComponentName mDouble12;

private PackageManager mPm;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mDefault = getComponentName();

mDouble11 = new ComponentName(

getBaseContext(),

"com.xys.changeicon.Test11");

mDouble12 = new ComponentName(

getBaseContext(),

"com.xys.changeicon.Test12");

mPm = getApplicationContext().getPackageManager();

}

public void changeIcon11(View view) {

disableComponent(mDefault);

disableComponent(mDouble12);

enableComponent(mDouble11);

}

public void changeIcon12(View view) {

disableComponent(mDefault);

disableComponent(mDouble11);

enableComponent(mDouble12);

}

private void enableComponent(ComponentName componentName) {

mPm.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

private void disableComponent(ComponentName componentName) {

mPm.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

}

}

OK了,禁用默认的Activity后,启用双11的activity-alias,结果不变还是指向了默认的Activity,但图标已经发生了改变。

根据ROM的不同,在禁用了组件之后,会等一会,Launcher会自动刷新图标。

效果参考下图。

741b9286e80ea75ba1a4.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值