当前位置: 首页>后端>正文

【方案解决】- 动态更换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"// 自己要改成自己类全路径名
            )
        )
    ) {
        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动态变更图标和应用名


https://www.xamrdz.com/backend/3pd1939420.html

相关文章: