android动态更改桌面icon和name

本文介绍如何通过配置AndroidManifest.xml实现应用桌面图标及名称的动态切换,并提供了具体的代码示例。涉及activity-alias配置、intent-filter使用及动态启用禁用组件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更改桌面的图标和名字跟Manifest中的配置脱不了关系,每写一个activity我们就要在Manifest中配置一下,特别是主入口MainActivity,下面是给Main必须要配置的,通常来说intent-filter中的这两个标志着程序在桌面的一个入口,如果你有两个activity这么配置了,那你的桌面就会出现两个图标两个入口。可以自己试试哈

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

一个activity可配置一个对应的activity-alias,enableb为true代表当前可用,targetActivity对应启动的activity,下面的intent-filter我就不讲了

<activity-alias
    android:name="com.demo.super.ui.activity.SplashActivity"
    android:enabled="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:targetActivity="com.demo.super.ui.activity.SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>
<activity-alias
    android:name="com.demo.super.ui.activity.MainNoteActivity"
    android:enabled="false"
    android:icon="@drawable/icon_two"
    android:label="第二个入口"
    android:targetActivity="com.demo.super.ui.activity.MainNoteActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>
动态配置,我这边配置了两个activity-alias,但同时也对应了两个activity,这也就意味着只要我的桌面图标变了 那用户打开桌面应用进入的是不同的activity,可做其他功能的扩展...不多说了哈,回归正题

<activity
    android:name="com.demo.super.ui.activity.SplashActivity"
    android:exported="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/main_activity_theme"
    android:windowSoftInputMode="stateUnchanged|adjustPan"/>
exported属性简单的讲当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。总体来讲就是是否支持其它应用调用当前组件。

<activity
    android:name="com.demo.super.ui.activity.MainNoteActivity"
    android:excludeFromRecents="true"
    android:exported="true"
    android:label="第二个入口"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Light.NoTitleBar">
</activity>

excludeFromRecents属性:是否可在当前进程中看到该activity;(题外 可以忽略)

默认是以enable为true的为当前程序的主入口。

下面贴切换代码:

private String NoteHome = "com.demo.super.ui.activity.MainNoteActivity";
private String SplashHome = "com.demo.super.ui.activity.SplashActivity";

private void changeAppIcon(String oldIcon, String newIcon) {
    PackageManager pm = mContext.getPackageManager();
    //禁用
    pm.setComponentEnabledSetting(new ComponentName(getBaseContext(), oldIcon),
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    //启用
    pm.setComponentEnabledSetting(new ComponentName(getBaseContext(), newIcon),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

}
changeAppIcon(NoteHome, SplashHome);

禁用、启用通过packageManage.setCompomentEnabledSetting

这里还挺坑的,如果在当前activity中去调用了changeAppIcon后,应用会自动退出,回到桌面,桌面过一会便会刷新了icon。

我们想要的功能是点击了做了切换图标icon后,应用不会退出,便百度找解决方案,几乎没人找到,有人讲是setCompomentEnabledSetting第三个参数的问题,第三个参数应该是PackageManager.DONT_KILL_APP,从始至终都是这样子写的,但是应用还是会退出,参考了几个竞品也做了相同功能,但是对方却没有出现此问题,仔细研究了对方的更改图标的操作流程后,我大致明白了它的思路和解决方法,对方应该是把这个操作放在了二级页面,在二级页面做了一些他们自己的逻辑操作后,再最后这个二级页面finish之前立马去调用切换方法,只要调用了,切换图标便会生效。

通俗点说只要在操作了切换图标的方法了 在退出应用前把当前页面finish掉就行了,我便在它finish之前做了这个操作。成功解决,但是,,,,,,,至于为什么,还没搞懂。希望有看到的大神指点一下。


最后切记一下activity-alias中的name一定不要改!!!一定不要改!!!一定不要改!!!

要不然更改了图标,然后下次更新版本的时候对应的name也改了,那便会出现找不到应用程序~~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值