1、需求
我们在做谷歌桌面时,移植了一些我们自己的应用,但是有些应用是服务型的app,不需要显示在主页,要隐藏掉
2、解决方案
方法1:
解决办法很简单,阅读源码发现,谷歌桌面添加全部应用的源码在这里com/android/launcher3/model/AllAppsList.java
在这个add 方法里,根据mAppFilter里面的方法去过滤掉不需要add 的应用
这个类读取了一个数组文件R.array.filtered_components,这个文件里面定义了需要过滤的组件,我这里查看源码这个数组文件是空的,没有过滤任何app,这个文件在res/values/config.xml里面定义
可以在这里添加要过滤的包名
<!-- 定义一个字符串数组,用于存储需要过滤的组件名称 --><string-array name="filtered_components"><!-- 使用完整的类名,或者包名+类名的形式 --><item>com.example.package.SomeActivity</item><item>com.example.package.AnotherService</item><item>com.example.package.YetAnotherReceiver</item><!-- 添加更多需要过滤的组件 --></string-array>
方法2
直接在AppFilter.java类里面过滤
private final Set<ComponentName> mFilteredComponents;private List<String> mFilterAppList = null;public AppFilter(Context context) {mFilteredComponents = Arrays.stream(context.getResources().getStringArray(R.array.filtered_components)).map(ComponentName::unflattenFromString).collect(Collectors.toSet());mFilterAppList.add("你要过滤的包名");}public boolean shouldShowApp(ComponentName app) {if (mFilterAppList != null && mFilterAppList.contains(app.getPackageName())) {return false;}return !mFilteredComponents.contains(app);}
方法3
这个方法要修改编译文件,大家可不看,这里只提供一个思路,不同的供应商修改不一样
源码目录新增一个黑名单文件,修改编译MK文件,在MK文件里面将这个黑名单文件copy到out输出目录,比如/vendor/etc/google_hide_apk_list.txt,这样在编译固件的时候,系统的这个目录会包含这个文件,这样就可以在Launcher3里面读取这个文件找到要过滤的包名
public class AppFilter {private final Set<ComponentName> mFilteredComponents;private List<String> mFilterAppList = null;public AppFilter(Context context) {mFilteredComponents = Arrays.stream(context.getResources().getStringArray(R.array.filtered_components)).map(ComponentName::unflattenFromString).collect(Collectors.toSet());mFilterAppList = getBlackList();}public boolean shouldShowApp(ComponentName app) {if (mFilterAppList != null && mFilterAppList.contains(app.getPackageName())) {return false;}return !mFilteredComponents.contains(app);}private List<String> getBlackList() {mFilterAppList = new ArrayList<>();try (BufferedReader bfd = new BufferedReader(new FileReader("/vendor/etc/google_hide_apk_list.txt"))) {String retain;while ((retain = bfd.readLine()) != null) {mFilterAppList.add(retain.trim());if (!TextUtils.isEmpty(retain)){Log.d("AppFilter", "blacklist add packageName: " + retain);}}} catch (IOException e) {e.printStackTrace();}return mFilterAppList;}}
总结
这是常用的几种方法,第二种简单明了,直接在类里面过滤,还有什么疑问可留言沟通