Android4.2_Launcher_IconCache
来源:互联网 发布:淘宝如何提高排名 编辑:程序博客网 时间:2024/04/18 18:07
在LauncherApplication中用到了 IconCache,用来保存应用程序图标的缓存。
类设计:
这个类主要是提供了访问图标的接口,外界提供 组件名即可获得对应的图标。这里图标是缓存在内存中。核心是cacheLocked 这个函数。
类结构
public Drawable getFullResIcon(Resources resources, int iconId)public Drawable getFullResIcon(String packageName, int iconId)public Drawable getFullResIcon(ResolveInfo info)public Drawable getFullResIcon(ActivityInfo info)public Bitmap getIcon(Intent intent)public Bitmap getIcon(ComponentName component, ResolveInfo resolveInfo,<span style="white-space:pre"></span>HashMap<Object, CharSequence> labelCache)private CacheEntry cacheLocked(ComponentName componentName,<span style="white-space:pre"></span>ResolveInfo info, HashMap<Object, CharSequence> labelCache)
CacheEntry 对应一个应用,包括应用程序名称和图标。
INITIAL_ICON_CACHE_CAPACITY 缓存队列的长度。
mIconDpi 用来显示控制图标的大小。在构造函数中确定。
mDefaultIcon 如果应用程序没有自己的图标就使用默认的图标。对应的id 为com.android.internal.R.mipmap.sym_def_app_icon。在构造函数中实现。
publicvoid getTitleAndIcon(ApplicationInfo application, ResolveInfo info, HashMap<Object, CharSequence>labelCache)publicBitmap getIcon(ComponentName component, ResolveInfo resolveInfo,HashMap<Object,CharSequence>labelCache)publicBitmap getIcon(Intent intent)
这几个函数都是用来获取特定应用对应的图标或标题。他们最后都是调用cacheLocked从mCache中获得CacheEntry结构,然后从中获得需要的信息。
<span style="font-size:24px;">privateCacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,HashMap<Object,CharSequence>labelCache)</span>
源码:
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.android.launcher2;import android.app.ActivityManager;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.ActivityInfo;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.drawable.Drawable;import java.util.HashMap;/** * Cache of application icons. Icons can be made from any thread. */public class IconCache { @SuppressWarnings("unused") private static final String TAG = "Launcher.IconCache"; private static final int INITIAL_ICON_CACHE_CAPACITY = 50; private static class CacheEntry { public Bitmap icon; public String title; } private final Bitmap mDefaultIcon; private final LauncherApplication mContext; private final PackageManager mPackageManager; private final HashMap<ComponentName, CacheEntry> mCache = new HashMap<ComponentName, CacheEntry>(INITIAL_ICON_CACHE_CAPACITY); private int mIconDpi; public IconCache(LauncherApplication context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); mContext = context; mPackageManager = context.getPackageManager(); mIconDpi = activityManager.getLauncherLargeIconDensity(); // need to set mIconDpi before getting default icon mDefaultIcon = makeDefaultIcon(); } public Drawable getFullResDefaultActivityIcon() { return getFullResIcon(Resources.getSystem(), android.R.mipmap.sym_def_app_icon); } public Drawable getFullResIcon(Resources resources, int iconId) { Drawable d; try { d = resources.getDrawableForDensity(iconId, mIconDpi); } catch (Resources.NotFoundException e) { d = null; } return (d != null) ? d : getFullResDefaultActivityIcon(); } public Drawable getFullResIcon(String packageName, int iconId) { Resources resources; try { resources = mPackageManager.getResourcesForApplication(packageName); } catch (PackageManager.NameNotFoundException e) { resources = null; } if (resources != null) { if (iconId != 0) { return getFullResIcon(resources, iconId); } } return getFullResDefaultActivityIcon(); } public Drawable getFullResIcon(ResolveInfo info) { return getFullResIcon(info.activityInfo); } public Drawable getFullResIcon(ActivityInfo info) { Resources resources; try { resources = mPackageManager.getResourcesForApplication( info.applicationInfo); } catch (PackageManager.NameNotFoundException e) { resources = null; } if (resources != null) { int iconId = info.getIconResource(); if (iconId != 0) { return getFullResIcon(resources, iconId); } } return getFullResDefaultActivityIcon(); } private Bitmap makeDefaultIcon() { Drawable d = getFullResDefaultActivityIcon(); Bitmap b = Bitmap.createBitmap(Math.max(d.getIntrinsicWidth(), 1), Math.max(d.getIntrinsicHeight(), 1), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); d.setBounds(0, 0, b.getWidth(), b.getHeight()); d.draw(c); c.setBitmap(null); return b; } /** * Remove any records for the supplied ComponentName. */ public void remove(ComponentName componentName) { synchronized (mCache) { mCache.remove(componentName); } } /** * Empty out the cache. */ public void flush() { synchronized (mCache) { mCache.clear(); } } /** * Fill in "application" with the icon and label for "info." */ public void getTitleAndIcon(ApplicationInfo application, ResolveInfo info, HashMap<Object, CharSequence> labelCache) { synchronized (mCache) { CacheEntry entry = cacheLocked(application.componentName, info, labelCache); application.title = entry.title; application.iconBitmap = entry.icon; } } public Bitmap getIcon(Intent intent) { synchronized (mCache) { final ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, 0); ComponentName component = intent.getComponent(); if (resolveInfo == null || component == null) { return mDefaultIcon; } CacheEntry entry = cacheLocked(component, resolveInfo, null); return entry.icon; } } public Bitmap getIcon(ComponentName component, ResolveInfo resolveInfo, HashMap<Object, CharSequence> labelCache) { synchronized (mCache) { if (resolveInfo == null || component == null) { return null; } CacheEntry entry = cacheLocked(component, resolveInfo, labelCache); return entry.icon; } } public boolean isDefaultIcon(Bitmap icon) { return mDefaultIcon == icon; } private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, HashMap<Object, CharSequence> labelCache) { CacheEntry entry = mCache.get(componentName); if (entry == null) { entry = new CacheEntry(); mCache.put(componentName, entry); ComponentName key = LauncherModel.getComponentNameFromResolveInfo(info); if (labelCache != null && labelCache.containsKey(key)) { entry.title = labelCache.get(key).toString(); } else { entry.title = info.loadLabel(mPackageManager).toString(); if (labelCache != null) { labelCache.put(key, entry.title); } } if (entry.title == null) { entry.title = info.activityInfo.name; } entry.icon = Utilities.createIconBitmap( getFullResIcon(info), mContext); } return entry; } public HashMap<ComponentName,Bitmap> getAllIcons() { synchronized (mCache) { HashMap<ComponentName,Bitmap> set = new HashMap<ComponentName,Bitmap>(); for (ComponentName cn : mCache.keySet()) { final CacheEntry e = mCache.get(cn); set.put(cn, e.icon); } return set; } }}
0 0
- Android4.2_Launcher_IconCache
- Android4.2
- android4.2
- android4.2&android4.3去掉虚拟按键
- Android4.2 Input子系统
- Android4.2安装
- Android4.2 存储出错
- android4.2 中文翻译
- android4.2 recovery&reset_factory
- android4.2 camera icon
- Android4.2 broadcast 分析
- Android4.2 Camera子系统
- android----android4.2编译
- android4.2系统bug
- android----android4.2编译
- Android4.2蓝牙介绍
- Android4.2距离感应器
- android----android4.2编译
- ul li
- 信息系统开发与管理(一)
- Redis配置详解
- 《操作系统概念第六版》阅读笔记一 操作系统组成
- 管道和重定向
- Android4.2_Launcher_IconCache
- hibernate连接数据库出现错误
- Sql Server查询磁盘的可用空间,数据库数据文件及日志文件的大小及利用率
- Codeforces-Round 174(Cows and Sequence)(树状数组、高校算法)
- 在Eclipse 下启动tomcat无法访问
- Tcp和udp的区别
- yii Actions 理解
- Java与C++区别
- 源代码基本编译流程