专业网站建设培训机构,海口网站建设方案优化,html网页表格制作,seo外推一、需求背景 每逢重要佳节#xff0c;很多应用启动图标会自动更新为对应佳节的图标#xff0c;应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon#xff0c;因此需要提前将logo图标放入App资源文件件里 实际项目App更新…一、需求背景 每逢重要佳节很多应用启动图标会自动更新为对应佳节的图标应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon因此需要提前将logo图标放入App资源文件件里 实际项目App更新桌面启动图标由服务器端控制可以在App启动页里请求全局配置接口根据接口返回的是否更新启动图标字段值进行处理。 大多数都是用activity-alias方式更新启动图标和应用名称但是谷歌建议新建activity继承启动页的activity新建的activity里面是空的。 下面的代码采用新建activity继承启动页的activity方式实现动态更新App启动图标和应用名称 3.1 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_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/Theme.Testtools:targetApi31activityandroid:name.ui.activity.LauncherActivityandroid:exportedtrueintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activity!-- 更改启动图标和应用名称 --!-- activity-alias--!-- android:name.ui.activity.NewMainActivity--!-- android:enabledfalse--!-- android:exportedtrue--!-- android:iconmipmap/ic_launcher_shlx--!-- android:labelstring/app_name2--!-- android:targetActivity.ui.activity.MainActivity--!-- intent-filter--!-- action android:nameandroid.intent.action.MAIN /--!-- category android:nameandroid.intent.category.LAUNCHER /--!-- /intent-filter--!-- /activity-alias--activityandroid:name.ui.activity.LauncherActivityNewandroid:enabledfalseandroid:exportedtrueandroid:iconmipmap/ic_launcher_mid_autumn_festivalandroid:labelstring/app_name2android:targetActivity.ui.activity.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter/activityactivityandroid:name.ui.activity.MainActivityandroid:launchModestandardandroid:screenOrientationportrait /activityandroid:name.ui.activity.SettingActivityandroid:launchModestandardandroid:screenOrientationportrait //application/manifest注意 3.2 activity_launcher.xml代码
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ui.activity.LauncherActivityTextViewandroid:idid/tvSetLogoandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:layout_margin16dpandroid:backgroundcolor/blackandroid:gravitycenterandroid:text启动页android:textColorcolor/whiteandroid:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayout3.3 LauncherActivity.kt代码
package com.example.test.ui.activityimport android.content.ComponentName
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.test.R
import com.example.test.utils.LogUtilopen class LauncherActivity : AppCompatActivity() {private lateinit var mPackageManager: PackageManageroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
// enableEdgeToEdge()setContentView(R.layout.activity_launcher)
// ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -
// val systemBars insets.getInsets(WindowInsetsCompat.Type.systemBars())
// v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
// insets
// }// LogUtil.i(获取到的路径 simpleName${ LunchActivity::class.java.simpleName})
// LogUtil.i(获取到的路径 packageName${ LunchActivity::class.java.package.name})
// LogUtil.i(获取到的路径 name${ LunchActivity::class.java.name})/*获取到的路径 simpleNameLunchActivity获取到的路径 packageNamecom.example.test.ui.activity获取到的路径 namecom.example.test.ui.activity.LunchActivity*/initData()initView()initEvent()if (this::class.java.simpleName.equals(LauncherActivityNew::class.java.simpleName)) {LogUtil.i(没有 执行 updateLauncherIcon)startActivity(Intent(this, MainActivity::class.java))finish()} else {updateLauncherIcon()}}private fun initData() {mPackageManager applicationContext.packageManager}private fun initView() {}private fun initEvent() {}private fun updateLauncherIcon() {LogUtil.i(执行了 updateLauncherIcon)
// var festervalIcon ComponentName(baseContext, com.example.test.ui.activity.LunchActivity)var festervalIcon ComponentName(baseContext, LauncherActivityNew::class.java.name)enableComponent(festervalIcon)disableComponent(componentName)startMainActivity()}/*PackageManager.DONT_KILL_APPPackageManager.SYNCHRONOUS*///启用组件private fun enableComponent(componentName: ComponentName) {mPackageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)}//隐藏组件private fun disableComponent(componentName: ComponentName) {mPackageManager.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)}private fun startMainActivity() {val intent Intent(this, MainActivity::class.java)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)this.startActivity(intent)finish()}
}3.4 LauncherActivityNew.kt代码
class LauncherActivityNew : LauncherActivity() {
}3.5 activity_main.xml代码
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ui.activity.LauncherActivityTextViewandroid:idid/tvSetLogoandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:layout_margin16dpandroid:backgroundcolor/blackandroid:gravitycenterandroid:text打开设置页面android:textColorcolor/whiteandroid:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayout3.6 MainActivity.kt代码
package com.example.test.ui.activityimport android.content.Intent
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.example.test.Rclass MainActivity : AppCompatActivity(R.layout.activity_main) {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)findViewByIdTextView(R.id.tvSetLogo).setOnClickListener {startActivity(Intent(this,SettingActivity::class.java))}}
}3.7 activity_setting.xml代码
?xml version1.0 encodingutf-8?
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalTextViewandroid:layout_widthmatch_parentandroid:layout_height50dpandroid:layout_gravitycenterandroid:gravitycenterandroid:text设置android:textColorcolor/blackandroid:textSize20sp //LinearLayout3.8 SettingActivity.kt代码
package com.example.test.ui.activityimport android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.test.Rclass SettingActivity: AppCompatActivity(R.layout.activity_setting) {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)}
}