更改桌面的图标和名字跟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也改了,那便会出现找不到应用程序~~