项目案例 化妆品网站,中国app排行榜,大理建设工程信息网站,国内响应式网站模板设想一下#xff0c;当我们正在开发一款应用。随着某个节日的临近#xff0c;我们可能希望通过更改应用图标来增强用户的节日氛围#xff0c;例如在图标上添“新年特惠”或者“龙年大吉”等标签。
这种小小的改变看似不经意#xff0c;却能够吸引用户的注意。 运行时更改应…设想一下当我们正在开发一款应用。随着某个节日的临近我们可能希望通过更改应用图标来增强用户的节日氛围例如在图标上添“新年特惠”或者“龙年大吉”等标签。
这种小小的改变看似不经意却能够吸引用户的注意。 运行时更改应用程序图标 首先应用程序图标是从清单文件设置的就像任何其他应用程序组件一样。 Android系统读取manifest文件并相应地设置应用程序图标。
目前无法直接使用相关的代码在运行时更改应用程序图标但有一个解决方案就是使用activity-alias。
步骤1准备图标资源️ 步骤2修改AndroidManifest.xml
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsapplicationandroid:allowBackuptrueandroid:dataExtractionRulesxml/data_extraction_rulesandroid:fullBackupContentxml/backup_rulesandroid:iconmipmap/ic_launcher1android:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/Theme.TestAndroidtools:targetApi31activityandroid:name.MainActivityandroid:exportedtrueandroid:themestyle/Theme.TestAndroidintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activityactivity-aliasandroid:name.MainActivityAliasandroid:enabledfalseandroid:exportedtrueandroid:iconmipmap/ic_launcher2android:targetActivity.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity-alias/application/manifest我们定义了一个activity 和一个activity-alias 并在activity-alias中设置了新的icon。默认情况下disable activity-alias也就是设置android:enabled“false”。 应用安装时启动的是MainActivity然后我们可以调用代码将主Activity设置成MainActivityAlias就可以实现运行时更改Android 应用程序图标的内容了。即disable MainActivityenable MainActivityAlias。 如何设置呢就要使用到PackageManager 这个类了。
步骤3编写更改图标的代码 (假设我们使用Compose)
// 编写Activity的扩展方法
fun Activity.changeEnabledComponent(enabledPkgName: String,disabledPkgName: String,
) {packageManager.setComponentEnabledSetting(ComponentName(this, enabledPkgName),PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP)packageManager.setComponentEnabledSetting(ComponentName(this, disabledPkgName),PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)
}Composable
fun ChangeIconViews(activity: Activity, enabledPkgName: String, disabledPkgName: String) {Column(horizontalAlignment Alignment.CenterHorizontally) {val btnModifier Modifier.padding(vertical 2.5.dp)Button(modifier btnModifier, onClick {activity.changeEnabledComponent(enabledPkgName enabledPkgName,disabledPkgName disabledPkgName)}) {Text(text 切换成Test 1)}Button(modifier btnModifier, onClick {activity.changeEnabledComponent(enabledPkgName disabledPkgName,disabledPkgName enabledPkgName)}) {Text(text 切换成Test 2)}}
}class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {TestAndroidTheme {Surface(modifier Modifier.fillMaxSize().padding(vertical 5.dp),color MaterialTheme.colorScheme.background) {Box(contentAlignment Alignment.Center) {ChangeIconViews(activity thisMainActivity,enabledPkgName com.example.testandroid.MainActivity,disabledPkgName com.example.testandroid.MainActivityAlias)}}}}}
}
函数 changeEnabledComponent用于启用或禁用指定的组件使用 packageManager 对象的 setComponentEnabledSetting 方法来设置组件的启用状态。函数 ChangeIconViews 是一个Composable函数用于显示一个列Column布局并包含两个按钮。最后在MainActivity的 onCreate 方法中放置ChangeIconViews。
然后就能够实现在运行时更改Android应用程序图标这个需求了。
步骤4优化我们的代码
但是作为一名开发人员我们想要我们的代码更整洁更灵活的话我们就应该考虑优化我们的代码比如硬编码就不是很合适
ChangeIconViews(activity thisMainActivity,enabledPkgName com.example.testandroid.MainActivity,disabledPkgName com.example.testandroid.MainActivityAlias
)假设我们使用最新版的Android Studio工具开发使用build.gradle.kts编写我们的编译脚本使用build.gradle的话其实也差不多就是语法不大一样就可以像下面这样
...
private val mainActivity com.example.testandroid.MainActivity
private val mainActivityAlias com.example.testandroid.MainActivityAlias
android {...defaultConfig {...buildConfigField(String, main_activity, \${mainActivity}\)buildConfigField(String, main_activity_alias, \${mainActivityAlias}\)}...buildFeatures {...// 使用自定义的buildConfig需要开启这个功能buildConfig true}...
}
所以我们的MainActivity的onCreate就可以换成下面的代码
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {TestAndroidTheme {Surface(modifier Modifier.fillMaxSize().padding(vertical 5.dp),color MaterialTheme.colorScheme.background) {Box(contentAlignment Alignment.Center) {ChangeIconViews(activity thisMainActivity,enabledPkgName BuildConfig.main_activity,disabledPkgName BuildConfig.main_activity_alias)}}}}}
}除此之外我们发现AndroidManifest.xml中也有关于mainActivity和mainActivityAlias的硬编码比如下面的代码
activityandroid:name.MainActivity......
/activityactivity-aliasandroid:name.MainActivityAlias...android:targetActivity.MainActivity...
/activity-alias所以我们做一下优化
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsapplicationandroid:allowBackuptrueandroid:dataExtractionRulesxml/data_extraction_rulesandroid:fullBackupContentxml/backup_rulesandroid:iconmipmap/ic_launcher1android:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/Theme.TestAndroidtools:targetApi31activityandroid:name${main_activity}android:exportedtrueandroid:themestyle/Theme.TestAndroidintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activityactivity-aliasandroid:name${main_activity_alias}android:enabledfalseandroid:exportedtrueandroid:iconmipmap/ic_launcher2android:targetActivity${main_activity}intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity-alias/application/manifestandroid {...defaultConfig {...manifestPlaceholders.apply {set(main_activity, mainActivity)set(main_activity_alias, mainActivityAlias)}buildConfigField(String, main_activity, \${mainActivity}\)buildConfigField(String, main_activity_alias, \${mainActivityAlias}\)}...
}完整代码地址
感谢阅读Best Regards