您的位置:首页 > 移动开发

Android 动态修改app图标

2018-02-06 15:35 459 查看
一款商业级的app,动态修改app图标,这是很常用的功能了,特别是电商类的,双11一个图标,双12一个图标。我们不可能为了修改一个图标而特意去发布一个新版本。

解决方案:

1、在manifest的设置多个activity-alias。只显示其中一个,其他的隐藏。

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<activity-alias
android:name=".tag_11"
android:label="双11"
android:icon="@mipmap/ic_icon_11"
android:enabled="false"
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=".tag_12"
android:label="双12"
android:icon="@mipmap/ic_icon_12"
android:enabled="false"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>

</application>


applicatian中自带一个入口图标和名称,默认是启用的,所以只需要增加要修改的图标就行了,并设置android:enabled=”false” 暂不启用。

当特定时间到了,需要修改图标时:

public class MainActivity extends AppCompatActivity {

private PackageManager mPackageManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPackageManager=getApplicationContext().getPackageManager();
updateIcon();
}

//检查图标并更换
public void updateIcon(){
//获取当前的ComponentName
ComponentName currentName=getComponentName();

if (isDouble11()&&!currentName.getClassName().equals("com.hellokiki.myapplication.tag_11")){
ComponentName double11=new ComponentName(getBaseContext(),"com.hellokiki.myapplication.tag_11");
disableComponent(currentName);
enableComponent(double11);
Log.e("2018","双11");
}else if(isDouble12()&&!currentName.getClassName().equals("com.hellokiki.myapplication.tag_12")){
ComponentName double12=new ComponentName(getBaseContext(),"com.hellokiki.myapplication.tag_12");
disableComponent(currentName);
enableComponent(double12);
Log.e("2018","双12");
}
}

//是否双11期间
public boolean isDouble11(){
Calendar calendar=Calendar.getInstance();
calendar.set(2018,11-1,1);
long startTime=calendar.getTime().getTime();
calendar.set(2018,11-1,11);
long endTime=calendar.getTime().getTime();
long nowTime=System.currentTimeMillis();
if(startTime<nowTime&&nowTime<endTime){
return true;
}
return false;
}

//是否双12期间
public boolean isDouble12(){
Calendar calendar=Calendar.getInstance();
calendar.set(2018,12-1,1);
long startTime=calendar.getTime().getTime();
calendar.set(2018,12-1,12);
long endTime=calendar.getTime().getTime();
long nowTime=System.currentTimeMillis();
if(startTime<nowTime&&nowTime<endTime){
return true;
}
return false;
}

//启用组件
public void enableComponent(ComponentName componentName){
mPackageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
}

//隐藏组件
public void disableComponent(ComponentName componentName){
mPackageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
}

}


主要核心的就是:

mPackageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);

//第二个参数,PackageManager.COMPONENT_ENABLED_STATE_DISABLED为隐藏,
//PackageManager.COMPONENT_ENABLED_STATE_ENABLED为启用


参考:

https://www.jianshu.com/p/eecfd9e0b878
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息