java - 在Android Module React Native中动态更改应用程序图标以自动关闭应用程序
问题描述
在我的场景中,我正在使用下面的代码动态更新应用程序图标,但是每当我更新图标时,我正在关闭应用程序但图标是更新的。如何防止应用程序关闭。
我的代码
@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);
}
解决方案
不要启用/禁用活动。制作活动别名。您可以为每个别名提供不同的标签(显示为应用名称)和图标。您必须为每个别名指定不同的名称(用于参考)。
<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>
通过启用-禁用这些别名来切换图标。如果你做枚举会更好,这会让事情变得清晰。使用此代码在不同的活动别名之间切换:
科特林
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);
}
}
推荐阅读
- php - 基于属性值选择的 Xpath 在 PHP 中未按预期工作
- javascript - 有什么方法可以在窗口打开后立即使用变量弹出警报消息?
- security - phpmyadmin 下载 SHA256 不一致
- php - 使用 PHP 解析时,正则表达式未捕获新行或引号
- javascript - 多级引导导航栏:不能悬停在子元素上
- c++ - 对部分特化无效使用不完整类型
- css - 响应式网页在 Firefox 的开发模式下工作,但在我的 S9 Firefox 上却不行
- python-3.x - 如何为迭代 postOrder 遍历复制树以保护树
- regex - Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词
- python - 调用时出现 Python 描述符属性问题