依然是Launcher2的代码,这回是要将Launcher2中显示应用的图标进行自定义图标。
这个修改的想法产生自现在遇到的一个问题,就是对于一个自定义的Launcher来说,界面的图标风格和图标样式的统一是很重要的,所以就会经常的对于launcher中的应用程序图标进行修改,但是修改一两个应用的APK图标相对来说还算简单,但是对于大批量的修改的话就有点力所不及并且版本相当难管理。所以就想到,既然知道了launcher的加载和提取应用程序中icon_launcher的方法,那应该也是可以李代桃僵的将之半途中替换了来显示我们的自定义图标。于是就有了下面的修改了。
首先是将自定义的APK的launcher图标资源拷贝到launcher的资源文件下,之后开始进入代码部分,直接跳过图标提取部分代码的解析过程,看IconCache.java了
//是否为自定义图标的flag hzhang private static boolean isMyIcon = false; ......................................................... public Drawable getFullResIcon(ActivityInfo info) { Resources resources; try { resources = mPackageManager.getResourcesForApplication( info.applicationInfo); } catch (PackageManager.NameNotFoundException e) { resources = null; } if (resources != null) { int iconId = setAppIcon(info.packageName);//info.getIconResource(); if(iconId==0){ iconId = info.getIconResource(); isMyIcon = false; }else { isMyIcon = true; } if (iconId != 0 && !isMyIcon) { return getFullResIcon(resources, iconId); }else{ resources = mContext.getResources(); return getFullResIcon(resources, iconId); } } return getFullResDefaultActivityIcon(); }
上述代码分别是一个标志位的定义,这个标志位的作用是区分是否为我的修改目标应用,如果是我需要修改为自定义图标的应用则会置为真,否则反之。
同时也要说明下上述修改的意义,源码中的做法是会在每个指定的应用APK资源文件中去提取指定的图标资源作为即将显示的目标图片,而如果是我需要自定义的则我会指定其资源Resource路径为当前Launcher的Resource资源,并从中去找我指定的图片作为图标来代替。其中的setAppIcon则是进行判断是具体需要提取的图标为哪个应用的,是通过PackageName来判断的,并相应返回我在Launcher资源中指定的图片ID,并指定到iconId。
下面是setAppIcon函数代码
private static int setAppIcon(String packagename){ int iconid = 0; if(packagename.equalsIgnoreCase("com.my.xxx")){ //此处为应用包名,具体可根据自己需求进行判断 iconid = R.drawable.app_icon_xxx; //此处为图片资源 }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid = R.drawable.app_icon_xxx; }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid = 0; }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid = R.drawable.app_icon_xxx; }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid =R.drawable.app_icon_xxx; }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid = R.drawable.app_icon_xxx; }else if(packagename.equalsIgnoreCase("com.my.xxx")){ iconid = R.drawable.app_icon_xxx; } Log.e("Load App Icon", "App PackageName is ="+packagename); return iconid; }
到此处功能就基本实现了,可以看到基本都是简单的一些操作,只是在源码中添加了一点自己的判断增加了一部分自己的图片资源而已。
效果图就不贴了,很简单。基本可以实现所有图标的自定义,只需要知道PackageName即可,这也让我忽然想到了目前很多Launcher是可以换主题的,这大概也是算是简单的一个Launcher换主题的方法了,如果后期再统一加上图标背景的话应该会更能形成一致的风格显示。
简单记录下。