Android通过入口别名来动态修改icon

607 阅读1分钟
<activity android:name=".AdvertisementActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".default"
            android:targetActivity=".AdvertisementActivity"
            android:enabled="true"
            android:icon="@mipmap/ic_launcher">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>


        <activity-alias
            android:name=".double11"
            android:enabled="false"
            android:icon="@mipmap/liu"
            android:targetActivity=".AdvertisementActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <activity-alias
            android:name=".double12"
            android:enabled="false"
            android:icon="@mipmap/time"
            android:targetActivity=".AdvertisementActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

首先是你的Manifest, 我们使用activity-alias 来定义入口别名,这里只需要注意android:icon, android:enabled, android:name, android:targetActivity,这四个属性,分别是图标,是否激活入口, 名字, 目标Activity(也就是你要设置别名的Activity)

这里要注意,你原来的入口Activity要做修改把category属性去掉,并设置一个默认别名,将android:enabled设置成true,就是我代码中标红的地方。如果不设置的话会接下来会用问题。

public class AdvertisementActivity extends AppCompatActivity{

    private ComponentName mDefault;
    private ComponentName mDouble11;
    private ComponentName mDouble12;

    private PackageManager packageManager;

   
    @Override
    public void onCreate(Bundle saveInstanceBundle){
        super.onCreate(saveInstanceBundle);
        setContentView(R.layout.advertisement_activity);
       
        //动态更换图标
        mDefault = getComponentName();
        mDouble12 = new ComponentName(getBaseContext(), "com.xxxxx.double12")//全限定包名;
        mDouble11 = new ComponentName(getBaseContext(), "com.xxxxxx.double11");
        packageManager = getApplicationContext().getPackageManager();
        changeIcon12();
    }

    public void changeIcon12(){
        disableComponent(mDefault);
        disableComponent(mDouble11);
        enableConponent(mDouble12);

        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        List<ResolveInfo> resolves = packageManager.queryIntentActivities(intent, 0);
        for (ResolveInfo res : resolves) {
            if (res.activityInfo != null) {
                ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
                am.killBackgroundProcesses(res.activityInfo.packageName);
            }
        }
    }

    private void enableConponent(ComponentName componentName){
        packageManager.setComponentEnabledSetting(componentName
                , PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                , PackageManager.DONT_KILL_APP);
    }

    private void disableComponent(ComponentName componentName){
        packageManager.setComponentEnabledSetting(componentName
                , PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
    }

    
}

通过PackageManager来设置关闭或打开那个入口,注意我标红的地方。若你的APP自动关闭了,请看一下你的Manifest文件是否设置了默认别名,还有是否入口Activity的

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


\

是否去掉了


\

\