android动态更新的方法(android,移动开发)

时间:2024-05-03 12:46:55 作者 : 石家庄SEO 分类 : 移动开发
  • TAG :

android动态更新的方法

原理1 activity-alias

在AndroidMainifest中,有两个属性:

//决定应用程序***启动的Activityandroid.intent.action.MAIN//决定应用程序是否显示在程序列表里android.intent.category.LAUNCHER

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

原理2 PM.setComponentEnabledSetting

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

使用方式异常简单:

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,指向默认的Activity并带有双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片……等等等。

<activityandroid:name=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activity-aliasandroid:name=".Test11"android:enabled="false"android:icon="@drawable/s11"android:label="双11"android:targetActivity=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity-alias><activity-aliasandroid:name=".Test12"android:enabled="false"android:icon="@drawable/s12"android:label="双12"android:targetActivity=".MainActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity-alias>

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

publicclassMainActivityextendsAppCompatActivity{privateComponentNamemDefault;privateComponentNamemDouble11;privateComponentNamemDouble12;privatePackageManagermPm;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mDefault=getComponentName();mDouble11=newComponentName(getBaseContext(),"com.xys.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);}privatevoiddisableComponent(ComponentNamecomponentName){mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);}}

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

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

效果参考下图。

android动态更新的方法

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:android动态更新的方法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:android主流框架的特性是什么下一篇:

6 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18