陆续添加
本地安装ADT
jar:file:/E:/ref/Android/env/ADT/ADT-8.0.1.zip!/
1.生成Bitmap
一般用BitmapFactory类的静态方法
BitmapFactory.Options mOptions;
mOptions = new BitmapFactory.Options();
mOptions.inSampleSize = 1;
mOptions.inTempStorage = new byte[100 * 1024];
Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.flag1,mOptions));
一般的情况使用BitmapFactory.decodeResource(getResources(), R.drawable.flag1,mOptions)就可以生成一个bitmap ,Bitmap.createBitmap(Bitmap src) , 这个方法返回的bitmap可能是传入的object 也可能是copy的一份新的object,使用时注意。
/**
* Returns an immutable bitmap from the source bitmap. The new bitmap may
* be the same object as source, or a copy may have been made. It is
* initialized with the same density as the original bitmap.
*/
2.内存的释放
a 对象使用完后显示的设置为空。
b 重复使用对象
c 尽量使用本的变量
d xml中的背景图和button的背景图可以用drawable取出来作为成员变量或static的
这种用法注意要调用drawable.setCallback(null)将drawable对组件的引用置空,防止阻碍垃圾回收。
在横竖屏切换时 内存有时会持续增长,或者达到一个高点,查看某些组件是否持有layout的引用。
调用
final VMRuntime runtime = VMRuntime.getRuntime();
runtime.gcSoftReferences();
runtime.runFinalizationSync();
效果还可以的,至少我这次是这样。
3.知道名字取得res下资源的id
例如取得图片资源的id
private int getImageResourceID(String groupID) {
return getResources().getIdentifier(groupID.toLowerCase(), "drawable",
"org.android.brother.test");
}
org.android.brother.test 是你在文件中声明的包名
getIdentifier()方法的返回值: 资源找到正常返回
没有相应的资源 则返回0, 0 不是正确的id值
另外: getResources().getString(int id),这个方法如果相应的id是没有的,会返回NotFoundException异常,在包装使用的时候要注意处理异常。
4. ImageView 中的图片过大,无法适应
a.如果图片在xml中定义 (估计是在properties中设置Adjust view bounds 为true ,未试验)
b. 如果在代码中设置的图片--setImageDrawable(),使用setAdjustViewBounds(true)来是图片适应button的大小
5. 看了task 和 activity flag
有 activity A 和B ,B通过广播启动A ,并传值;B是dialog 类型的activity ,
在 A上弹出B ,B启动A ,发现 A 没有重新生成 ,而只是 调用了 onResume()方法,并没有 调用onCreate()
我需要重新启动一个新的activity,或者说需要更新数据
解决 :
a. broadcast启动A时 使用的是 FLAG_ACTIVITY_NEW_TASK ,将A的lanuchmode 设置为single task ,在A中添加方法OnNewIntent(Intent intent) 来接收新的intent,然后刷新页面,不过要注意OnNewIntent()不会调用onCreate()方法,需要的话要自己去写入。
b. 在broadcast启动A时 使用的是 FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP ,将A的lanuchmode 设置为standard ,这样每次都启动新的activity
不过A不在原来的任务中,它属于新的任务
6. 不同apk之间使用SharedPreferences 共享数据
a中写入:
getSharedPreferences(profilename, Context.MODE_WORLD_READABLE).edit();
ed.putString("key", "value");
return ed.commit();
b中读出:
try {
Context context = getBaseContext();
Context packageContext = context.createPackageContext(packagename_activity_a, Context.CONTEXT_RESTRICTED);
SharedPreferences sp = packageContext.getSharedPreferences(profilename, Context.MODE_WORLD_READABLE);
s = sp.getString("key","default");
} catch (NameNotFoundException e) {//
// TODO Auto-generated catch block
e.printStackTrace();
}
packagename_activity_a 是activity a 所在app的包,
注意几个值Context.CONTEXT_RESTRICTED ,Context.MODE_WORLD_READABLE
7. 长按home键时不出现activity的图标
就是不让图标显示在recent app list,
将manifest里对应activity的属性加上 android:excludeFromRecents="true"
8.将activity的主题设置为dialog的样式
配置文件中activity的属性加上android:theme="@android:style/Theme.Dialog"
其他activity的样式 详见 apidemo中。
9. 使用第三方apk打开pdf文件
private final String pdf_file = "file:///sdcard/a.pdf" ;
private String data_type = "application/pdf".toLowerCase();
Uri uri= Uri.parse(pdf_file);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri,data_type );
startActivity(intent);
那么注册为Intent.ACTION_VIEW 并且type为"application/pdf"就会启动并打开传入的uri
10. 上述问题中如果系统中没有安装符合条件的软件 ,那么就会报出错误。
我们应该提前检查是否安装,避免此类错误;
需要检索所有安装的activity 查看是否有满足条件的;
部分代码需上面的9中的。
设置action name 和支持打开文件的类型setType作为条件去检索
private boolean canOpenFile(){
PackageManager manager = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_VIEW, null);
mainIntent.setType(data_type );
final List<ResolveInfo> apps = manager.queryIntentActivities(mainIntent, 0);
if (apps.size() == 0){
Log.i("******", "no activity can open the file ");
return false;
}
if (debug){
for (int i = 0; i < apps.size(); i++) {
ResolveInfo info = apps.get(i);
Log.i("***** "+i, info.activityInfo.name+"----" + info.loadLabel(manager));
}
}
return true ;
}
这个方法也可以获取所有安装软件的信息 图标等等详细信息。