动态更改应用程序图标导致 Android 模块 React Native 自动关闭应用程序

4
在我的场景中,我使用以下代码动态更新应用程序图标,但每当我更新图标时,应用程序就会关闭,尽管图标已更新。如何防止应用程序关闭。 我的代码
@ReactMethod
public void changeIcon(String enableIcon) {
    final Activity activity = getCurrentActivity();
    PackageManager pm = activity.getApplicationContext().getPackageManager();
    System.out.println(activity.getComponentName());
    //Remove old icons
    pm.setComponentEnabledSetting(activity.getComponentName(),
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    //Display new icons
    pm.setComponentEnabledSetting(new ComponentName(activity.getBaseContext(),enableIcon),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

你的意思是指应用程序在运行此代码时崩溃,但图标更新成功吗? - gpl
@gpl 图标已成功更新,但应用程序在没有错误的情况下关闭了。 - Dev app
你正在重新启动同一个活动吗? - gpl
@gpl 我不会重新启动。但是我需要保持相同的活动。 - Dev app
1个回答

0
不要启用/禁用活动。创建活动别名。您可以为每个别名提供不同的标签(显示为应用程序名称)和图标。您必须为每个别名提供不同的名称(用于引用)。
<activity android:name=".MainActivity">
     <intent-filter>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter
</activity>

<activity-alias
        android:label="Red app"
        android:icon="@mipmap/icon_red"
        android:name=".RED"
        android:enabled="true"
        android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

<activity-alias
        android:label="Blue app"
        android:icon="@mipmap/icon_blue"
        android:name=".BLUE"
        android:enabled="true"
        android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

<activity-alias
        android:label="Green app"
        android:icon="@mipmap/icon_green"
        android:name=".GREEN"
        android:enabled="true"
        android:targetActivity=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

通过启用或禁用这些别名来切换图标。如果您使用枚举,将使事情更清晰。使用此代码在不同的活动别名之间进行切换:

KOTLIN

enum class ICON_COLOUR { RED, BLUE, GREEN }

private fun setIcon(targetColour: ICON_COLOUR) {
    for (value in ICON_COLOUR.values()) {
        val action = if (value == targetColour) {
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED
        } else {
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED
        }
        packageManager.setComponentEnabledSetting(
            ComponentName(BuildConfig.APPLICATION_ID, "${BuildConfig.APPLICATION_ID}.${value.name}"),
            action, PackageManager.DONT_KILL_APP
        )
    }
}

JAVA(枚举版本)

private enum ICON_COLOUR {
    RED("RED"), 
    GREEN("GREEN"), 
    BLUE("BLUE"), 
 
    private String color;
 
    Environment(String color) {
        this.color = color;
    }
 
    public String getColor() {
        return color;
    }
}

private void setIcon(ICON_COLOUR targetColour) {
    int action;
    for (ICON_COLOUR value : ICON_COLOUR.values()) {
        if (value == targetColour)
            action = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
        else
            action = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            
        packageManager.setComponentEnabledSetting(
            new ComponentName(BuildConfig.APPLICATION_ID, value.getColor()),
            action, PackageManager.DONT_KILL_APP);
    }
}

JAVA(字符串数组版本)

private String []iconColour = {"RED", "GREEN",  "BLUE"};

private void setIcon(String targetColour) {
    int action;
    for (String value : iconColour) {
        if (value.equals(targetColour))
            action = PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
        else
            action = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
            
        packageManager.setComponentEnabledSetting(
            new ComponentName(BuildConfig.APPLICATION_ID, value),
            action, PackageManager.DONT_KILL_APP);
    }
}

非常感谢。我正在检查它。 - Dev app
你能否帮我更新一下代码,因为在很多地方都出现了 fun setIcon 的错误。看起来你提供的是 Kotlin 的示例,但我需要 Java 代码。 - Dev app
please check it. - gpl
在这里遇到了“无法解析符号”错误,枚举静态类ICON_COLOUR { RED,GREEN,BLUE }; - Dev app
是的,你说了那个,我也说了。很抱歉我不知道React Native。如果你喜欢,我可以用字符串数组来替换枚举。 - gpl
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接