BitmapFactory.Option 由一个属性public boolean inPurgeable
如果inPurgeable 设为True的话表示使用BitmapFactory创建的Bitmap用于存储Pixel的内存空间在系统内存不足时可以被回收,在应用需要再次访问Bitmap的Pixel时(如绘制Bitmap或是调用getPixel),系统会再次调用BitmapFactory decoder重新生成Bitmap的Pixel数组。为了能够重新解码图像,bitmap要能够访问存储Bitmap的原始数据。
本例显示了inPurgeable设为True和False的两种情况,不停的创建一个bitmap
mBitmapArray[mDecodingCount] = BitmapFactory.decodeByteArray( bitstream, 0, bitstream.length, mOptions);
mOptions 为BitmapFactory.Option类型,mOptions.isPurgable可以为true和false。 在isPurgeable为false时表示创建的Bitmap的Pixel内存空间不能被回收,这样BitmapFactory在不停decodeByteArray创建新的Bitmap对象,不同设备的内存不同,因此能够同时创建的Bitmap个数可能有所不同,200个bitmap足以使大部分的设备重新OutOfMemory错误。
当isPurgable设为true时,系统中内存不足时,可以回收部分Bitmap占据的内存空间,这时一般不会出现OutOfMemory 错误。
本例有两个例子NonPurgeable 和 Purgeable,其定义的代码是同样的类PurgeableBitmap和PurgeableBitmapView, 但它们在Android的Launcher都有自己的启动图标。这是因为在AndroidManifest.xml中使用了activity-alias定义。
activity-alias定义可以为同一个Activty指定别名,指定不同的IntentFilter或其它配置,从而使得同一个Activity可以有不同的属性,图标等。 activity-alias 和activity支持的属性基本一致,在功能上和Activity基本一致。
<activity android:name=”.graphics.PurgeableBitmap”
android:label=”Graphics/PurgeableBitmap/NonPurgeable”>
<intent-filter>
< action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.SAMPLE_CODE” />
< /intent-filter>
< /activity>
<activity-alias android:targetActivity=”.graphics.PurgeableBitmap”
android:name=”Purgeable” android:label=”Graphics/PurgeableBitmap/Purgeable”>
<intent-filter>
< action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.SAMPLE_CODE” />
< /intent-filter>
< /activity-alias>
可以看到activity-alias定义的targetActivity 和activity的android:name指向同一个Activity。
程序中使用getPackageManager 读取Activity的Label,根据Label的值来判断启动的是Purgeable还是NonPurgeable.