但凡一款用戶量有一定的規(guī)模之后炸茧,運(yùn)營都會(huì)在逢年過節(jié)的時(shí)候做一些活動(dòng)來提高日活稿静,促銷商品等。所以為了配合活動(dòng)控漠,我們開發(fā)也需要在App啟動(dòng)圖標(biāo)上做出活動(dòng)的效果悬钳,換一個(gè)活動(dòng)圖標(biāo),而且還在不額外發(fā)布版本的情況下碉渡。
效果演示圖:
這里是Github代碼直通車
實(shí)現(xiàn)步驟
1.首先在AndroidManifest中創(chuàng)建一個(gè)activity的別名滞诺,用于替換啟動(dòng)頁的activity环疼,啟動(dòng)圖標(biāo)為活動(dòng)圖標(biāo)。<activity-alias> 標(biāo)簽為每個(gè) Activity 注冊(cè)一個(gè)別名, 通過這個(gè)別名就能啟動(dòng)對(duì)應(yīng)的目標(biāo) Activity淋叶。它最重要的屬性是:
android:enabled 屬性伪阶,布爾類型,是否開啟別名設(shè)置斟湃,默認(rèn)值為 true桐早;
<activity-alias
android:name=".mainActivity"
android:targetActivity=".MainActivity"
android:icon="@mipmap/ic_festerval"
android:label="@string/app_name"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
2.頁面代碼如下:
class MainActivity : AppCompatActivity() {
private var mPackageManager: PackageManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mPackageManager = applicationContext.packageManager
ivIconFesterval.setOnClickListener {
var festervalIcon = ComponentName(baseContext, "com.example.appiconchange.mainActivity")
enableComponent(festervalIcon)
disableComponent(componentName)
}
ivIconNomal.setOnClickListener {
var nomalIcon = ComponentName(baseContext, "com.example.appiconchange.MainActivity")
enableComponent(nomalIcon)
disableComponent(componentName)
}
}
//啟用組件
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
)
}
}
這里用到了ComponentName這個(gè)類,ComponentName可以啟動(dòng)Activity祷膳、Service屡立。第一個(gè)參數(shù)為應(yīng)用包名,另一個(gè)參數(shù)為要啟動(dòng)的Activity或服務(wù)所在包名+類名。
功能實(shí)現(xiàn)的核心在這里:
mPackageManager?.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP
)
mPackageManager?.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP
)
當(dāng)我們需要開啟或關(guān)閉某個(gè)組件罩句,只要?jiǎng)?chuàng)建packageManager對(duì)象和ComponentName對(duì)象门烂,并調(diào)用packageManager對(duì)象的setComponentEnabledSetting方法。
參數(shù)componentName:組件名稱
參數(shù)newState:組件新的狀態(tài)屯远,可以設(shè)置三個(gè)值慨丐,分別是如下:
不可用狀態(tài):COMPONENT_ENABLED_STATE_DISABLED
可用狀態(tài):COMPONENT_ENABLED_STATE_ENABLED
默認(rèn)狀態(tài):COMPONENT_ENABLED_STATE_DEFAULT
參數(shù)flags:行為標(biāo)簽泄私,值可以是DONT_KILL_APP或者0。