IconCache原理

于 2015年05月19日 发布在 android开发 跳到评论

(系列文章点这里)

在Launcher3中,IconCache从名字上来看就是用来做应用图标缓存的,以前没有在意过这个类,最近刚好需要研究下,就做个笔记。

IconCache不仅会保存图标,还会保存应用的title, 我们可以看到缓存都是保存在mCache中的,他是个HashMap,键是ComponentName和UserHandleCompat组成的对象, 值是一个对象CacheEntry, CacheEntry的三个成员是图标,标题和内容描述[其实我也搞不懂]。

在Launcher启动的时候, 会在LauncherApplication中初始化LauncherAppState,而他会初始化IconCache对象, 刚开运行的时候IconCache肯定是空的, 只有在Launcher.java 这个Activity启动之后才会有缓存。在Launcher.onCreate()方法中,执行了IconCache的flushInvalidIcons, 会清空现有的缓存,如果Activity的方向发生了改变[即图标的大小发生了变化],原来的缓存可能都没有用了。那什么时候IconCache会被完全清空呢, 也就是图标和文字无效的时候,在用户的语言发生了变化之后会被清空,因为获取的图标和title很可能已经不同了。

下面来看图片是怎么加进去的。添加图标最关键的方法是IconCache.cacheLocked(), 这个方法会获取某个Component[Activity]的图标和标题,并存入mCache中, 我们看到这个方法名最后是“Locked”表明,方法调用的时候已经保证是线程安全的,可以看到IconCache.cacheLocked()每个调用的方法都有关键字synchronized。

最后IconCache还会生成一个系统默认图标,如果一个Activity由于某种原因我们没有找到对应的图标, 那么IconCache会返回一个默认图标, 这个图标是从系统取到的资源, 资源id是android.R.mipmap.sym_def_app_icon, 不同的系统这个资源对应的图标是不一样的, 比如4.4 和 5.1的系统默认图标就是不一样的。

好了IconCache需要说的就这么多。

 

 

 

本文共有 7条评论 | 沙发:文章评论

  1. 其实-我不懂说道:

    这么好的文章怎么没有评论呢~ 顶一个

  2. 顾竹君说道:

    LauncherApplication这个类怎么没有发现, 我看他的Manifest里面也没有写啊

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)