使用活动别名更改应用程序图标和名称时出现NameNotFoundException

时间:2018-09-27 07:28:12

标签: android kotlin

我尝试在运行时更改我的应用程序图标和名称。

val pm = activity.packageManager
val packageName = BuildConfig.APPLICATION_ID

activity.packageManager.setComponentEnabledSetting(
    ComponentName(packageName, packageName + activeName),
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP)

for (i in disableNames.indices) {
try {
    activity.packageManager.setComponentEnabledSetting(
        ComponentName(packageName, disableNames[i]),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP)
     } catch (e: Exception) {
         e.printStackTrace()
     }
}

应用程序图标和名称更改正确,但是如果在尝试更改应用程序主题后出现崩溃

Unable to start activity ComponentInfo{com.app.test.debug/com.app.test.presentation.ui.main.activity.MainActivity}: java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{com.app.test.debug/com.app.test.presentation.ui.main.activity.MainActivity-default}

我在做什么错了?


    <activity-alias
        android:exported="true"
        android:label="Default"
        android:icon="@mipmap/ic_launcher_red"
        android:name=".presentation.ui.main.activity.MainActivity-default"
        android:enabled="true"
        android:targetActivity="com.app.test.presentation.ui.main.activity.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

    <activity-alias
        android:exported="true"
        android:label="Second alias"
        android:icon="@mipmap/ic_launcher_green"
        android:name=".presentation.ui.main.activity.MainActivity-settings"
        android:enabled="false"
        android:targetActivity="com.app.test.presentation.ui.main.activity.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity-alias>

这是我的活动别名的样子

这部分关于代码的问题

   activity.packageManager.setComponentEnabledSetting(
                ComponentName(BuildConfig.APPLICATION_ID, "com.app.test.presentation.ui.main.activity.MainActivity-default"),
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)

当我删除此部分时,它将有所帮助。但是现在我得到了两个新旧图标。旧图标不会删除。

逻辑:
1)启用活动别名。
2)禁用旧的活动别名
3)重新创建活动
4)崩溃java.lang.IllegalArgumentException:android.content.pm.PackageManager $ NameNotFoundException:ComponentInfo {com.app.test.debug / com.app.test.presentation.ui.main.activity.MainActivity-default}

2 个答案:

答案 0 :(得分:0)

我认为您不为此操作使用清单配置。

清单中的

必须设置活动别名

like:

<activity-alias android:enabled=["true"|"false"]
 android:exported=["true"|"false"]
 android:icon="drawable"
 android:label="string resource"
 android:name="string resource"
 android:permission="string resource"
 android:targetActivity="string resource">

</activity-alias>

我发现了this link

和这个github example

注意:

仅在Java中工作 如果需要,不要使用kotlin,因为在kotlin ComponentName()方法中,检查输入文件的存在性

使用Java代码和

答案 1 :(得分:0)

您没有做错任何事情 我有同样的问题。 仅在使用相同代码创建完全新的活动后才进行调试,以便再次获得Crash java.lang.IllegalArgumentException: android.content.pm.PackageManager$NameNotFoundException:

它告诉您找不到活动-因为您更改了活动的名称-因此-无法找到该活动,无法安装和替换apk。 当您删除“ COMPONENT_ENABLED_STATE_DISABLED”时-您犯了第二个罪行-您留下了2个正在运行的活动。而一次只能允许一个。

要对其进行修复,请确保您返回默认的活动别名,否则您将无法再调试该活动。卸载应用程序,并可能创建新活动。 也许-我没有尝试-尝试更改活动别名的顺序,因此当前选择的活动将是第一个。