App图标动态变化产品:Launcher中的AppIcon可以动态变化吗?开发:无产品:我们可以动态更改启动器中的应用程序图标吗?Development:NoProduct:WecandynamicallychangetheAppintheLauncherIconinsideDevelopment:NoProduct:我们可以在Launcher中动态改变App的Icon吗?开发:让我想想……原理1——activity-alias在AndroidMainifest中有两个属性://判断应用程序***StartedActivityandroid.intent.action.MAIN//判断应用程序是否显示在程序列表android.intent.category.LAUNCHER另外还有一个activity-alias属性,可以用来创建多个不同的Entrance,相信做过systemSetting和Launcher开发的开发者在源码中应该见多了系统代码。原则2——PM.setComponentEnabledSettingPackageManager是一个大型命令类,可以管理所有系统组件。当然,如果你已经root了,你也可以管理其他应用的所有组件。一些系统优化工具使用这种方法来禁用一些后台服务。.使用方式异常简单:privatevoidenableComponent(ComponentNamecomponentName){mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);}privatevoiddisableComponent(ComponentNamecomponentName){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,指向带有双11图片的默认Activity,然后创建一个双12的activity-alias,指向默认的Activitywith双十二的照片……等等等等。等等,有个问题,就是会在Launcher上显示3个条目,所以通过default我们会先禁用这些activity-alias,然后在需要的时候启用它们。养兵千日,用兵一时publicclassMainActivityextendsAppCompatActivity{privateComponentNamemDefault;privateComponentNamemDouble11;privateComponentNamemDouble12;privatePackageManagermPm;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mDefault=getComponentName();mDouble11=newComponentName(getBaseContexts(),".changeicon.Test11");mDouble12=newComponentName(getBaseContext(),"com.xys.changeicon.Test12");mPm=getApplicationContext().getPackageManager();}publicvoidchangeIcon11(Viewview){disableComponent(mDefault);disableComponent(mDouble12);enableComponent(mDouble11);}publicvoidchangeIcon12(Viewview){disableComponent(mDefault);disableComponent(mDouble11);enableComponent(mDouble12);}privatevoidenableComponent(ComponentNamecomponentName){mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);}私有无效磁盘ableComponent(ComponentNamecomponentName){mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);}}OK,禁用默认Activity后,启用双十一activity-alias,结果还是一样还是指向默认Activity,但是图标已更改。根据ROM的不同,禁用该组件后,Launcher会在一段时间后自动刷新图标。效果参考下图。专栏作者简介eclipse_xu:Android高级开发工程师;《Android群英传》、《Android群英传:神兵利器》的作者,慕课Android讲师;CSDN博客专家