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>


    componentname用来从哈希表mCache中获得CacheEntry结构。如果mCache中没有匹配项。会从info中获取到应用相应的信息填充到哈希表中。






源码:

/* * 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
原创粉丝点击