Android 简单笔记

陆续添加

 

 

本地安装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 ;

 

}

 

 这个方法也可以获取所有安装软件的信息 图标等等详细信息。

 

 

 

你可能感兴趣的:(Android 简单笔记)