【音的特性有四种:音高、音长、音量和音色】 --- 《五线谱基础教程》
Android项目的分析一般从AndroidManifest.xml文件开始,从这个文件我们可以一窥这个app定义的activity、service等四大组件的配置,以及使用的sdk版本和声明的权限等信息。
一 标签的顺序问题
首先使用Android Lint工具检查下这个配置文件,我们发现出现了一个lint警告:
这个说明<uses-permission>标签应该位于<application>标签前面,当调整了这两个标签的位置后,将会出现另外一个警告:
即<uses-sdk>标签也应该放置在<application>标签前面。
二 <manifest>标签的android:installLocation属性
从上图可以看到installLocation属性的取值有三个,用于指示程序安装策略:
1)“auto”:程序默认安装在内存,如果内存空间不足,将安装在外存中;并且之后用户可以通过系统设置随意地在内存和外存之间切换程序的安装位置;
2)“internalOnly”:程序只能安装在内存中,当内存空间不足时,程序将安装失败,当我们不指定installLocation属性时,这是我们程序的默认行为。
3)“preferExternal”:程序优先考虑安装在外存中(SD卡),但当外存空间不足或其他原因影响时,程序也可以被安装在内存中;并且之后用户可以通过系统设置随意地在内存和外存之间切换程序的安装位置;
一般要根据应用的类型来决定应用程序的installLocation取值,以下几种类型的应用不应该安装在外存中(SD卡):
Services、Alarm Services、Input Method Engines、Live Wallpapers、AppWidgets、Account Managers、Sync Adapters、Device Administrators、Broadcast Receivers listening for "boot completed"、Copy Protection。
因此,一般的程序,如果没有特殊要求的话,一般都取值为“auto”。
关于installLocation属性的更多信息可参见:
http://developer.android.com/guide/topics/manifest/manifest-element.html#install
http://developer.android.com/guide/topics/data/install-location.html
三 JamendoApplication
JamendoApplication继承自Application类,代表本程序的唯一实例,主要用于维护整个程序会用到的公共的资源实例,例如图片缓存ImageCache、web请求缓存RequestCache、播放引擎PlayerEngine、当前正在使用的MediaPlayer、均衡器Equalizer、播放列表PlayList、下载管理器DownloadManager以及手势处理器等等。本节就先介绍下两个缓存的简单实现,其他的后续再陆续介绍。
3.1)ImageCache
ImageCache用于缓存从网络上下载的图片资源到内存中,便于节省手机流量,代码比较简单,继承WeakHashMap类,大部分工作由该类来完成。WeakHashMap是基于key-value对实现,它的特点是当除了自己对某个key的引用外,不存在其他指向这个key的引用时,这种Map会丢弃该key对应的value的值。代码如下:
public class ImageCache extends WeakHashMap<String, Bitmap> { public boolean isCached(String url){ return containsKey(url) && get(url) != null; } }
鉴于Jamendo涉及到的图片资源占用比较少,主要是专辑的封面显示。所以这种方式可行,当处理的图片较多较大时,例如壁纸类应用、图片浏览类应用时,一般需要设计二级缓存,即内存缓存和外存缓存,并指定两个缓存的大小,并使用LRU算法进行图片资源的替换。具体可参考 http://developer.android.com/training/displaying-bitmaps/index.html
3.2)RequestCache
该类结合LinkedList和Hashtable实现以当缓存空间不足时,删除最旧的url的策略,其中LinkedList用于将最新的url插入链表头部,并在缓存空间不足时,移除链表尾部的url;Hashtabel用于存储url请求和对应的响应数据之间的映射关系,代码如下:
public class RequestCache { private static int CACHE_LIMIT = 10; // 缓存大小 private LinkedList<String> mHistory; // 以链表形式缓存url,当缓存满了时,将最旧的url弹出 private Hashtable<String, String> mCache; public RequestCache() { mHistory = new LinkedList<String>(); mCache = new Hashtable<String, String>(); } public void put(String url, String data) { mHistory.add(url); // 缓存满了,需要先将旧的移除 if (mHistory.size() > CACHE_LIMIT) { String old_url = (String) mHistory.poll(); // 得到最旧的url mCache.remove(old_url); } mCache.put(url, data); } public String get(String url) { return mCache.get(url); } }