中华视窗是诚信为本,市场在变,我们的诚信永远不变...
一、简介 现在诸多APP在特殊的日子都会将APP的图标修改为相对应图标,懂开发的人肯定会想我没有更新APP啊,为什么APP的图标换了呢? 二、效果图
应用首次安装效果图
启动应用后,点击“节日图标”则会出现如下效果图:
应用内部效果图
再次回到手机桌面,则会发现APP图标已经改变,效果图如下所示:
修改图标之后的效果图
三、撸代码 3.1 .xml代码如下所示
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="study.com.appicondemo">
<application
android:allowBackup="true"
android:icon="@mipmap/icon_normal"
android:label="APP图标"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
activity>
<activity-alias
android:name=".icon_tag"
android:enabled="true"
android:icon="@mipmap/icon_normal"
android:label="App图标-普通版"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
intent-filter>
activity-alias>
<activity-alias
android:name=".icon_tag_1212"
android:enabled="false"
android:icon="@mipmap/icon_festival"
android:label="App图标-节日版"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
intent-filter>
activity-alias>
application>
manifest>
3.2 .java代码如下所示
package study.com.appicondemo;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import me.leolin.shortcutbadger.ShortcutBadger;
public class MainActivity extends AppCompatActivity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
TextView tvFestival = (TextView) findViewById(R.id.tv_festival);
tvFestival.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchIcon(1);
iv.setBackgroundResource(R.mipmap.icon_festival);
int badgeCount = 1;
//用于生成APP又上角的图标,但是在我手机(华为荣耀青春版,Android系统7.0)没有效果
//不过在另一款华为手机(华为meta7 Android系统6.0)上亲测有效
//此处使用的是第三插件ShortcutBadger,地址是https://github.com/leolin310148/ShortcutBadger
boolean applyCount = ShortcutBadger.applyCount(MainActivity.this, badgeCount);//for 1.1.4+
Toast.makeText(MainActivity.this, "App图标-节日版" + applyCount, Toast.LENGTH_SHORT).show();
}
});
TextView tvNormal = (TextView) findViewById(R.id.tv_normal);
tvNormal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switchIcon(2);
iv.setBackgroundResource(R.mipmap.icon_normal);
Toast.makeText(MainActivity.this, "App图标-普通版", Toast.LENGTH_SHORT).show();
}
});
}
/**
* @param useCode 1、为活动图标 2 为用普通图标 3、不启用判断
*/
private void switchIcon(int useCode) {
try {
//要跟manifest的activity-alias 的name保持一致
String icon_tag = "study.com.appicondemo.icon_tag";
String icon_tag_1212 = "study.com.appicondemo.icon_tag_1212";
if (useCode != 3) {
PackageManager pm = getPackageManager();
ComponentName normalComponentName = new ComponentName(
getBaseContext(),
icon_tag);
//正常图标新状态,此处使用用来修改清单文件中activity-alias下的android:enable的值
int normalNewState = useCode == 2 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
//新状态跟当前状态不一样才执行
if (pm.getComponentEnabledSetting(normalComponentName) != normalNewState) {
//PackageManager.DONT_KILL_APP表示执行此方法时不杀死当前的APP进程
pm.setComponentEnabledSetting(
normalComponentName,
normalNewState,
PackageManager.DONT_KILL_APP);
}
ComponentName actComponentName = new ComponentName(
getBaseContext(),
icon_tag_1212);
//活动图标新状态
int actNewState = useCode == 1 ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
//新状态跟当前状态不一样才执行
if (pm.getComponentEnabledSetting(actComponentName) != actNewState) {
pm.setComponentEnabledSetting(
actComponentName,
actNewState,
PackageManager.DONT_KILL_APP);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
四、总结 在使用上述的方法进行APP的图标更新的话,触发方法之后需要等待系统的刷新图标才可以显示效果来。不过在使用adb安装应用的时候,设备上APP图标必须和清单文件中的-alias中的:=”true”的时候的图标情况保持一致,否则会报如下错误:
Demo源码地址