安卓动态更换图标,这一篇应该够详细了吧~

APP多个图标以及名称动态更换

首先是权限

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

其次是要启动的launch app

<activity
    android:name=".main"
    android:icon="图标"
    android:label="名称"
    android:configChanges="keyboardHidden|orientation|screenSize|locale|layoutDirection|screenLayout|mcc|mnc|touchscreen|keyboard|keyboardHidden|navigation"
    android:launchMode="singleTop"
    android:windowSoftInputMode="adjustResize|stateHidden" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

其次是它的其他进入路口,也就是使用activity-alias

图标,名称都可以自定义,只需要注意targetActivity要同launch。
name是后面启动的入口类,不要相同。
一开始建议enable都为false,不然主页会有两个图标显示。

<activity-alias
    android:name=".sha1"
    android:enabled="false"
    android:icon="图标1"
    android:label="名称1"
    android:targetActivity=".main">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>
<activity-alias
    android:name=".sha2"
    android:enabled="false"
    android:icon="图标2"
    android:label="名称2"
    android:targetActivity=".main">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>
<activity-alias
    android:name=".sha3"
    android:enabled="false"
    android:icon="图标3"
    android:label="名称3"
    android:targetActivity=".main">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

需要注意的是替换图标及名称建议在launch类里面进行,不然会出现莫名无法启动的问题,可能跟启动方式有关,所以后面启动方式我都改为了用包名启动,这样不会有问题。

动态更改图标

写详细一点,可以自己考虑精简
注意DISABLED和ENABLED的设定。

PackageManager pm = getPackageManager();

以下其中xxx为应用包名

替换为sha1

pm.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); //关掉默认启动
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha2"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);//关掉sha2
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha3"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);//关掉sha3
pm.setComponentEnabledSetting(new ComponentName(getBaseContext(), "xxx.xxx.xxx.sha1"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);//启动sha1

剩下的以此类推

替换为sha2

pm.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha1"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha3"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(getBaseContext(), "xxx.xxx.xxx.sha2"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

替换为sha3

pm.setComponentEnabledSetting(getComponentName(),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha1"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting( new ComponentName(getBaseContext(),"xxx.xxx.xxx.sha2"),PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
pm.setComponentEnabledSetting(new ComponentName(getBaseContext(), "xxx.xxx.xxx.sha3"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

在这里要注意的是,如果要启动此入口类app,在首次启动时用

Intent intent = new Intent();
intent.setClassName("xxx.xxx.xxx","xxx.xxx.xxx.main");
startActivity(intent);

替换后启动方式为

Intent intent = new Intent();
intent.setClassName("xxx.xxx.xxx","xxx.xxx.xxx.sha1");
startActivity(intent);

只需要保存更改后的包名即可,类似

String play = getSharedPreferences("syswj", Context.MODE_PRIVATE).getString("play","xxx.xxx.xxx.main");
Intent intent = new Intent();
intent.setClassName("xxx.xxx.xxx",play);
startActivity(intent);

在这里插入图片描述
时隔多年,又写文咯o( ̄︶ ̄)o

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 上只使用 Lua 实现应用图标动态更换相对困难,因为 Android 系统的应用图标是需要在 Java 层面进行设置的。不过,你可以通过使用 Lua 调用 Java 代码的方式,实现应用图标动态更换。 以下是一种可能的实现方式: 1. 首先,在 Java 层面编写一个设置应用图标的方法,如下所示: ``` private void setAppIcon(int resId) { PackageManager pm = getPackageManager(); ComponentName componentName = new ComponentName(this, MainActivity.class); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setComponent(componentName); intent.putExtra("android.intent.extra.shortcut.ICON_RESOURCE", Intent.ShortcutIconResource.fromContext(this, resId)); intent.putExtra("duplicate", false); Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "App Name"); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, resId)); sendBroadcast(shortcut); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } ``` 这个方法接收一个资源 ID,将其作为应用图标进行设置,并创建一个桌面快捷方式。 2. 在 Lua 层面,通过使用 LuaJava 库,调用上述方法,如下所示: ``` local activity = luajava.bindClass("com.unity3d.player.UnityPlayer"):currentActivity() local PackageManager = luajava.bindClass("android.content.pm.PackageManager") local componentName = luajava.newInstance("android.content.ComponentName", activity, "com.example.myapp.MainActivity") local pm = activity:getPackageManager() pm:setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP) local Intent = luajava.bindClass("android.content.Intent") local shortcutIntent = Intent(Intent.ACTION_MAIN) shortcutIntent:addCategory(Intent.CATEGORY_LAUNCHER) shortcutIntent:setComponent(componentName) shortcutIntent:putExtra("android.intent.extra.shortcut.ICON_RESOURCE", Intent.ShortcutIconResource.fromContext(activity, R.drawable.new_icon)) shortcutIntent:putExtra("duplicate", false) local shortcut = Intent("com.android.launcher.action.INSTALL_SHORTCUT") shortcut:putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent) shortcut:putExtra(Intent.EXTRA_SHORTCUT_NAME, "App Name") shortcut:putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(activity, R.drawable.new_icon)) activity:sendBroadcast(shortcut) pm:setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP) ``` 在这个 Lua 代码中,我们首先通过 Luajava 库获取当前 Activity 对象和 PackageManager 对象,然后使用这些对象调用 Java 方法来设置应用图标。在这个示例中,我们假设新的应用图标资源 ID 是 R.drawable.new_icon。 需要注意的是,这种方式需要在 AndroidManifest.xml 文件中添加以下权限: ``` <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> ``` 总的来说,虽然可以通过 Lua 调用 Java 代码实现应用图标动态更换,但是这种方式相对麻烦,而且需要对 Android 系统的权限进行一定的了解。建议使用 Java 代码实现应用图标动态更换,或者使用专门的应用图标更换库来实现这个功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值