本文共 4903 字,大约阅读时间需要 16 分钟。
先讨论实现步骤:
1.在AndroidManifest.xml里添加 标签,并且 启动页 的标签要先去掉,在它所属的每个 里加上 就好了2.在换图标的activity里:
//在onCreat()方法里:
cl_defaultIcon = findViewById(R.id.cl_defaultIcon); cl_defaultIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switchIcon(1); } }); cl_mapIcon = findViewById(R.id.cl_mapIcon); cl_mapIcon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switchIcon(2); } }); cl_mailIcon = findViewById(R.id.cl_mailIcon); cl_mailIcon.setOnClickListener(new View.OnClickListener() { @Override public 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表示执行此方法时不杀死当前的APP进程用这个换图标会退出到桌面,然后生成新的图标,这是效果,
我优化之处:如果切换的图标是存在的图标,会有Toas提示,大家要想加个DIaLog自定义弹窗提示,就写个方法在if里面展示下就好了 如果没解决请联系我; qq:1393508286转载地址:http://bxqu.baihongyu.com/