【方案解決】- 動態更換app桌面圖標和名字

簡介

關于動態更app圖標和名字,網上已經有很多文章了,按照網上的步驟,的確可以達到目的,但是同時也會出現一些問題 。

  1. 更換圖標和名字后,應用閃退,不能重新啟動。
  2. 使用網上某些解決方案后,發現雖然解決了應用閃退的問題,但是發現,在某些使用場景,應用還是會閃退(比如應用有熱起的流程的時候)。

下面就簡單說一下我的解決方案

正文

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)
}

參考

Android動態變更圖標和應用名

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容