AndroidManifest.xml之动态修改应用的图标和应用名称

一、activity-alias标签

Android支持动态修改应用程序的图标和应用名称。如双11双12的时候淘宝和京东等APP在不需要更新的情况下自动更换了图标,所以动态更新应用的图标和名称的最佳应用场景就像电商类项目的促销活动时使用。
Android之所以支持动态更新图标是因为在AndroidManifest.xml中有一个activity-alias标签,从标签名字上就能看出这是activity的别名。我们看官网的介绍,
https://developer.android.com/guide/topics/manifest/activity-alias-element.html

An alias for an activity, named by the targetActivity attribute. The target must be in the same application as the alias and it must be declared before the alias in the manifest. 

大致意思是 :这是属性targetActivity:的activity的别名,这个属性targetActivity:的activity跟这个别名必须在同一个application下,并且targetActivity必须在这个别名钱定义。

下面看看这个activity-alias标签都有那些属性

    <activity-alias android:enabled=["true" | "false"]
                    android:exported=["true" | "false"]
                    android:icon="drawable resource"
                    android:label="string resource"
                    android:name="string"
                    android:permission="string"
                    android:targetActivity="string" >
        . . .
    </activity-alias>

好多属性都跟activity标签的属性一致的,主要看定义的时候提到的targetActivity属性,这个属性的值是你要用别名代替的那个activity,而且这个activity必须在这个activity-alias之前定义。这里说一点,如果我们想动态的更换图标和改名称,就必须是申明`

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>` 这个启动activity的别名,在别名里面修改。

二、动态修改图标和名称

1、设置launch activity的别名:

<activity android:name=".MainActivity"
            android:icon="@mipmap/ic_launcher"
            >

            <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity-alias
            android:name=".Test"
            android:enabled="false"
            android:icon="@mipmap/launch_01"
            android:label="测试应用名称"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

这里设置了mainactivity的别名,在activity-alias中修改icon和label属性,修改成想要更换的图标和名称,这个name就是别名的名字,在activity中就是activity的类名。一定不能漏掉android:targetActivity=".MainActivity"属性。

2、在需要更换的地方操作

首先我在布局文件中activity_main.xml定义一个简单的按钮,当点击的时候更换图标。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.pursue.it.iconchange.MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改图标"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

</android.support.constraint.ConstraintLayout>

在mainactivity中:

package com.pursue.it.iconchange;

import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changeIcon();
            }
        });
    }


//修改图标和名称的方法
    private void changeIcon() {
        PackageManager pm = getApplicationContext().getPackageManager();
        System.out.println(getComponentName());
       //去掉旧图标
        pm.setComponentEnabledSetting(getComponentName(),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
        //显示新图标
        pm.setComponentEnabledSetting(new ComponentName(
                        getBaseContext(),
                        "com.pursue.it.iconchange.Test"),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    }
}

点击按钮等待数秒,可以在手机桌面上看到图标和名称自动更换了。
实际开发中,应该是根据网络请求的结果来触发changeIcon()方法来更换图标。
demo地址:http://download.csdn.net/download/sushineboy/10145540

发布了29 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sushineboy/article/details/78711546