簡介
關于動態更app圖標和名字,網上已經有很多文章了,按照網上的步驟,的確可以達到目的,但是同時也會出現一些問題 。
- 更換圖標和名字后,應用閃退,不能重新啟動。
- 使用網上某些解決方案后,發現雖然解決了應用閃退的問題,但是發現,在某些使用場景,應用還是會閃退(比如應用有熱起的流程的時候)。
下面就簡單說一下我的解決方案
正文
AndroidManifest配置
<activity
android:name=".NewLoadActivity"
android:enabled="false"
android:exported="true"
android:icon="@mipmap/video"
android:label="test"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/Theme.MySFM.Load">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".FMLoadActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:theme="@style/Theme.MySFM.Load">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.MySFM.Main" />
NewLoadActivity繼承于FMLoadActivity,沒有其它實現
在FMLoadActivity更改應用圖標和名字
private fun changeIcon() {
if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED != packageManager.getComponentEnabledSetting(
ComponentName(
this,
"com.kk.ll.nj.my.sm.NewLoadActivity"http:// 自己要改成自己類全路徑名
)
)
) {
packageManager.setComponentEnabledSetting(
ComponentName(FMApp.app, "com.kk.ll.nj.my.sm.FMLoadActivity"),// 自己要改成自己類全路徑名
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
packageManager.setComponentEnabledSetting(
ComponentName(FMApp.app, "com.kk.ll.nj.my.sm.NewLoadActivity"), // 自己要改成自己類全路徑名
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
// 更換后,棧內的activity會被全部清除,這也是閃退的原因,這里新建棧啟動新的activity
val intent = Intent(this, NewLoadActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
startActivity(intent)
}
}
在onCreate調用改方法
當我們有熱起的流程的時候,需要在相關流程判斷FMLoadActivity和NewLoadActivity那一個是可用的,如果啟動不可用的組件會導致應用崩潰。
if (currentActiveAty != null && currentActiveAty is FMBaseActivity && currentActiveAty !is FMLoadActivity && !isAbort) {
if (PackageManager.COMPONENT_ENABLED_STATE_DISABLED != activity.packageManager.getComponentEnabledSetting(
ComponentName(
activity,
"com.kk.ll.nj.my.sm.NewLoadActivity"
)
)
) NewLoadActivity.start(activity, true) else FMLoadActivity.start(activity, true)
}