简介
关于动态更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"// 自己要改成自己类全路径名
)
)
) {
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动态变更图标和应用名