河北省建设厅网站站长/株洲今日头条新闻
先讨论实现步骤:
1.在AndroidManifest.xml里添加 标签,并且 启动页 的标签要先去掉,在它所属的每个 里加上 就好了
<!--来路由启动页--><activity android:name=".advert.activity.SplashActivity"></activity><activity-aliasandroid:name=".appIcon1"android:enabled="true"android:label="美女那些图"android:icon="@drawable/app_background"android:targetActivity=".advert.activity.SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias><activity-aliasandroid:name=".appIcon2"android:enabled="false"android:icon="@drawable/map_icon"android:label="地图"android:targetActivity=".advert.activity.SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias><activity-aliasandroid:name=".appIcon3"android:enabled="false"android:icon="@drawable/new_mail_icon"android:label="邮件"android:targetActivity=".advert.activity.SplashActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity-alias>
2.在换图标的activity里:
//在onCreat()方法里:
cl_defaultIcon = findViewById(R.id.cl_defaultIcon);cl_defaultIcon.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switchIcon(1);}});cl_mapIcon = findViewById(R.id.cl_mapIcon);cl_mapIcon.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switchIcon(2);}});cl_mailIcon = findViewById(R.id.cl_mailIcon);cl_mailIcon.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switchIcon(3);}});
private void switchIcon(int useCode) {try {//要跟manifest的activity-alias 的name保持一致String icon_tag_default = getPackageName() + ".appIcon1";String icon_tag_map = getPackageName() + ".appIcon2";String icon_tag_mail = getPackageName() + ".appIcon3";if (useCode != 11) {PackageManager pm = getPackageManager();ComponentName defaultComponentName = new ComponentName(this, icon_tag_default);int defaultState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;if (pm.getComponentEnabledSetting(defaultComponentName) != defaultState) {//正常图标新状态
// new Handler().postDelayed(new Runnable() {
// @Override
// public void run() {
// showAuditDialog();
// }
// }, 3000);//新状态跟当前状态不一样才执行pm.setComponentEnabledSetting(defaultComponentName,defaultState,PackageManager.DONT_KILL_APP);Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();} else {if (useCode == 1) {Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();Log.e(TAG,"和当前版本一样1");}}//2.地图ComponentName actComponentMap = new ComponentName(this, icon_tag_map);//正常图标新状态int actMapState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;if (pm.getComponentEnabledSetting(actComponentMap) != actMapState) {//PackageManager.DONT_KILL_APP表示执行此方法时不杀死当前的APP进程pm.setComponentEnabledSetting(actComponentMap,actMapState,PackageManager.DONT_KILL_APP);Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();} else {if (useCode == 2) {Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();Log.e(TAG,"和当前版本一样2");}}//3.邮件ComponentName actComponentMail = new ComponentName(this, icon_tag_mail);//正常图标新状态int actMailState = useCode == 3 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;if (pm.getComponentEnabledSetting(actComponentMail) != actMailState) {pm.setComponentEnabledSetting(actComponentMail,actMailState,PackageManager.DONT_KILL_APP);Toast.makeText(getBaseContext(), "正在生成桌面图标,预计三秒种生效", Toast.LENGTH_SHORT).show();} else {if (useCode == 3) {Toast.makeText(getBaseContext(), "选择的样式和当前版本一样", Toast.LENGTH_SHORT).show();Log.e(TAG,"和当前版本一样3");}}}} catch (Exception e) {}}
以上基本是实现app图标换肤所需的代码
关于可能会遇到的闪退问题
一定要用这个PackageManager.DONT_KILL_APP,网上有些是PackageManager.其它的…PackageManager.DONT_KILL_APP和PackageManager.SYNCHRONOUS的区别使用可以了解;
PackageManager.DONT_KILL_APP表示执行此方法时不杀死当前的APP进程
用这个换图标会退出到桌面,然后生成新的图标,这是效果,
我优化之处:如果切换的图标是存在的图标,会有Toas提示,大家要想加个DIaLog自定义弹窗提示,就写个方法在if里面展示下就好了
如果没解决请联系我;
qq:1393508286
有问题请加我的技术群解答:
qq群:637866565