我需要以编程方式实现更改应用程序图标,就像在 Telegram 应用程序中一样。我在谷歌上搜索了答案,但没有找到类似的东西。在 Telegram 应用程序的应用程序设置中,您可以将默认的应用程序图标替换为建议的图标之一,重新启动应用程序后,图标会发生变化。
S e A r C 谷歌中的 h
动态更改启动器应用程序图标的简单步骤
第 1 步:- 创建空类来声明您想要的图标 在应用程序启动器图标中使用(如果你有 n 个图标,那么你必须 创建 n 个空类),例如,我使用了 2 个图标,所以我 创建了 2 个类,一个用于新启动器图标,另一个用于旧图标。 对于新图标,我创建了一个类 NewIconAlias ,对于旧图标,我创建了一个类 旧图标别名。
NewLauncherAlias.kt
class NewLauncherAlias {
}
旧启动器别名.kt
class OldLauncherAlias {
}
第 2 步:- 在清单中声明
。 注意:- 我们必须在清单中声明要用于动态更改启动器图标的所有图标。<activity-alias>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DynamicLauncherIcon"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<activity-alias
android:name="com.demo.dynamiclaunchericon.alias.OldLauncherAlias"
android:enabled="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="Old Icon"
android:targetActivity=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
<activity-alias
android:name="com.demo.dynamiclaunchericon.alias.NewLauncherAlias"
android:enabled="false"
android:icon="@mipmap/ic_launcher_new"
android:roundIcon="@mipmap/ic_launcher_new_round"
android:label="New Icon"
android:targetActivity=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
</application>
我们只有 2 个图标,所以我们声明 2 个。
第3步:-现在我们必须从 Activity/Fragment 执行更改启动器图标请求。 对于更改启动器图标,我们必须首先禁用旧的或现有的启动器图标,然后启用我们在清单中声明的新图标。
禁用旧的/现有的图标:-
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
OldLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP,
)
启用新图标:-
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
NewLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP,
)
更新启动器图标的活动代码:-
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mBinding = ActivityMainBinding.inflate(LayoutInflater.from(this))
setContentView(mBinding.root)
mBinding.changeIcon.setOnClickListener {
updateToNewIcon(this)
}
mBinding.oldIcon.setOnClickListener {
updateToOldIcon(this)
}
}
private fun updateToOldIcon(MainActivity: MainActivity) {
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
OldLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP,
)
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
NewLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP,
)
Toast.makeText(
this@MainActivity,
"Launcher one has been applied successfully",
Toast.LENGTH_SHORT,
).show()
}
fun updateToNewIcon(context: Activity) {
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
OldLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP,
)
packageManager.setComponentEnabledSetting(
ComponentName(
this@MainActivity,
NewLauncherAlias::class.java,
),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP,
)
Toast.makeText(
this@MainActivity,
"Launcher one has been applied successfully",
Toast.LENGTH_SHORT,
).show()
}
}
您可以从GitHub
查看完整的演示项目