是工作中遇到的问题,一个app锁的应用要求能够更改图标,众所周知更改app图标只能在清单文件上更改,


那我现在要在app内更改图标总不能换资源文件吧,那怎么办?
首先我们要了解一下activity与activity-alisa的区别,我认为唯一的区别就在于activity是一个实体他伴有xml文件,可以更改布局,是一个具体的活动,他可以声明一个活动。
而activity-alisa也可以声明一个活动,但它允许为一个活动创建一个或多个别名,这意味着你可以使用多个不同的名称引用同一个活动。每个<activity-alias>标签必须指定一个唯一的名称,并通过android:targetActivity属性指定目标活动的名称(通常是声明的<activity>标签的名称)。

了解了这个就好办了,下面我将用最笨的方法完成这个需求。

先大致看一下,可以换成这么多的图标,
<activity
android:name=".activity.MainActivity"
android:exported="true" /> <!-- 别名1,特定活动需要的图标如:双11,国庆节等 -->
<activity-alias
android:name=".P1Activity"
android:enabled="false"
android:exported="true"
android:icon="@drawable/photo1"
android:label="@string/app_name"
android:targetActivity=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias> <!-- <intent-filter> -->
<!-- <action android:name="android.intent.action.MAIN" /> -->
<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
<!-- </intent-filter> -->
<!-- </activity> -->
<!-- 固定设置一个默认的别名,用来替代原MainActivity -->
<activity-alias
android:name=".DefaultAliasActivity"
android:enabled="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:targetActivity=".activity.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
这里我拉出来两个,都是指定的Mainactivity,唯一不同的是对应的icon,简单的说就算我把标签作为res的容器了。
public void setDefaultAlias(String activityname) {
PackageManager packageManager = getPackageManager();
ComponentName name2 = new ComponentName(this, "com.heaven.smartapplock.V1Activity");
packageManager.setComponentEnabledSetting(name2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name3 = new ComponentName(this, "com.heaven.smartapplock.V2Activity");
packageManager.setComponentEnabledSetting(name3, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name4 = new ComponentName(this, "com.heaven.smartapplock.V3Activity");
packageManager.setComponentEnabledSetting(name4, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name5 = new ComponentName(this, "com.heaven.smartapplock.V4Activity");
packageManager.setComponentEnabledSetting(name5, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name6 = new ComponentName(this, "com.heaven.smartapplock.P1Activity");
packageManager.setComponentEnabledSetting(name6, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name7 = new ComponentName(this, "com.heaven.smartapplock.P2Activity");
packageManager.setComponentEnabledSetting(name7, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name8 = new ComponentName(this, "com.heaven.smartapplock.P3Activity");
packageManager.setComponentEnabledSetting(name8, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name9 = new ComponentName(this, "com.heaven.smartapplock.P4Activity");
packageManager.setComponentEnabledSetting(name9, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name10 = new ComponentName(this, "com.heaven.smartapplock.T1Activity");
packageManager.setComponentEnabledSetting(name10, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name11 = new ComponentName(this, "com.heaven.smartapplock.T2Activity");
packageManager.setComponentEnabledSetting(name11, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name12 = new ComponentName(this, "com.heaven.smartapplock.T3Activity");
packageManager.setComponentEnabledSetting(name12, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name13 = new ComponentName(this, "com.heaven.smartapplock.T4Activity");
packageManager.setComponentEnabledSetting(name13, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name14 = new ComponentName(this, "com.heaven.smartapplock.DefaultAliasActivity");
packageManager.setComponentEnabledSetting(name14, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
ComponentName name1 = new ComponentName(this, activityname);
packageManager.setComponentEnabledSetting(name1, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
这是一个最笨蛋的方法,将每个标签的名字对应活动的开关
COMPONENT_ENABLED_STATE_DISABLED//表示无法被启动
COMPONENT_ENABLED_STATE_ENABLED//表示启动
activityname这个参数就是你想要替换的那个icon的标签名(可以理解为标签对应着iocn)
845

被折叠的 条评论
为什么被折叠?



