Android笔记2016-03-14

来源:互联网 发布:淘宝儿童秋装 编辑:程序博客网 时间:2024/06/05 05:04

一般画图是要将dip转化为px,防止现实不一致

  • 如图的代码,DesityUtils.dip2px(getContext(),45);是将45dp的转为px,java代码中默认的单位是px。
  • 在Android的布局文件中,往往使用dp作为控件的宽度和高度尺寸,但是在Java代码中,调用getWidth()方法获得的尺寸单位 却是像素px,这两个单位有明显的区别:dp和屏幕的密度有关,而px与屏幕密度无关,所以使用时经常会涉及到两 者之间的互相转化,代码示例如下:
public int dip2Px(Context context, float dp) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dp * scale + 0.5f);}public int px2Dip(Context context, float px) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (px / scale + 0.5f);}

使用intent的模式解决Back Activity退出所有的Activitys

当我们不断的intent到多个Activity时,如何Back返回到Main,方法如下:

  • 采用FLAGACTIVITYCLEAR_TOP退出整个程序(多activity)

  • 思路:通过Intent的Flags来控制堆栈去解决android中,每打开一个Activity,便会在栈中加入一个Activity,当该Activity被摧毁后,栈中便移除了它,并且栈中Activity是按照开打的先后顺序依次排排列的。

Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标 志 Intent.FLAGACTIVITYCLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity

对象初始化的一些问题

方式一:List list=new ArrayList()
方式二:ArrayList list=new ArrayList() 两种方式看似区别不大,但方式二比方式一效率高

  • 1.5 直接调用成员 很多程序员在访问类成员时,习惯通过 getter 和 setter 方法 来访问,这是一个良好的习惯。但 getter、setter 方法在访问成员 时比直接访问成员效率低,如果只是简单访问可以直接访问成 员而不通过 setter、getter 方法[4]。
  • 1.6 将成员变量缓存到本地 访问成员变量比访问本地变量要慢,因此可以将成员变量 缓存到本地来提高效率

对于Bitmap的回收问题

很多的时候,我们使用Bitmap不会出现多大的问题。但是当机器资源不够的情况下,很多应用都会报出 OutOfMemoryError,当然报出这样的异常往往是给Bitmap分配内存时内存不足引起的。即便是很小的一个图片,也会有出错,如何解决呢?
我的解决办法如下:

public static Bitmap createBitmap(int width, int height, Bitmap.Config config) {     Bitmap bitmap = null;     try {         bitmap = Bitmap.createBitmap(width, height, config);     } catch (OutOfMemoryError e) {         while(bitmap == null) {             System.gc();             System.runFinalization();             bitmap = createBitmap(width, height, config);         }     } }

经过最近不断的实验证明,当内存泄漏很大的时候,上述方法根本无法避免内存溢出。其实避免内存溢出还是要靠平时写代码的时候自己去注意。很多时候的溢出主要是因为Bitmap和Drawable资源没被释放造成的,尤其是当项目中图片资源很多的时候,这个问题尤为突出。
解决办法:当CreateBitmap之后,当这个Bitmap用完之后,那需要recycle这个资源。
还有当需要更换图片的背景资源的时候需要使用到Drawable,当需要更换那个Drawable时,原来的Drawable需要setCallback(null)来使Activity对原来的资源解除引用,从而使资源得到释放。Java的内存管理不像C++一般,但是也有它的灵活之处,只要仔细想想,还是可以将内存管理好的。
销毁的时候使用:

protected void onDestroy(){          BitmapDrawable b=(BitmapDrable)iv.getDrawable();          if(b!=null&&!b.getBitmap().isRecycled()){              b.getBitmap().recycle();          }          super.onDestroy();}

对于多个Bitmap的显示问题,一般流程是:

Created with Raphaël 2.1.0开始LruCache缓冲显示Bitmap设置默认头像异步线程加载图片,并且添加到LruCacheyesno

对于System.gc和System.runFinalization()的区别

System.gc(); //告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的

System.runFinalization(); //强制调用已经失去引用的对象的finalize方法

对于Activity的销毁onDestroy的一些处理

@Overridepublic void onDestroy() {    super.onDestroy();  // Always call the superclass    // Stop method tracing that the activity started during onCreate()    //停止追踪onCreate里的方法    android.os.Debug.stopMethodTracing();}

对于onPause()是不适合进行耗时的操作的,但是onStop()是可以的。因为onPause进行的时候,别的Activity开始进行onCreate。对于onDestory()也不适宜进行耗时操作。

对于Android的生命周期

onCreate() -> onStart() -> onResume()->onPause()-> onStop()-> onDestory()
如下图:

不要在非UI线程中初始化ViewStub,否则会返回null;

AndroidStudio的快捷键和使用问题

  • 安装时,需要cp .android的文件到Library文件夹下;要不会导致安装不上;
  • 对于Android模拟器的安装启动,要先安装加速器;

关于Fragment和Activity的xml嵌套

通过标签进行嵌套。如:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/fragment"    android:name="com.example.google.MainActivityFragment"    android:layout_width="match_parent"    android:layout_height="match_parent"    app:layout_behavior="@string/appbar_scrolling_view_behavior"    tools:layout="@layout/fragment_main" />

上面的demo是google提供的,tools:layout=”@layout/fragment_main”似乎和android:name=”com.example.google.MainActivityFragment”有点重复?其实tools:layout只是提供了预览功能的。主要的关联是通过name来关联类

关于绘画的切割模式种类

在使用方法如下:

      Paint paint = new Paint();      paint.setFilterBitmap(false);      paint.setStyle(Paint.Style.FILL);      Bitmap bm=makeSrc(getWidth(), getHeight());      int sc = canvas.saveLayer(0,0, bm.getWidth(), bm.getHeight(), paint,         Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG                 | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG                 | Canvas.FULL_COLOR_LAYER_SAVE_FLAG                 | Canvas.CLIP_TO_LAYER_SAVE_FLAG);      //底层图片的绘制      super.onDraw(canvas);      //第二个图片      //画一个圆形截取底层的图片,而这个截取区域为圆形      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));      Bitmap mSrcB =makeDst(getWidth(),getHeight());      canvas.drawBitmap(mSrcB, 0, 0, paint);      paint.setXfermode(null);

模式图片:

            //后面插入的会擦去后面的图片            new PorterDuffXfermode(PorterDuff.Mode.CLEAR),            //直接显示后来的图片            new PorterDuffXfermode(PorterDuff.Mode.SRC),            new PorterDuffXfermode(PorterDuff.Mode.DST),            new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),            new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),            new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),            //截取一个形状为第二的图片的底图片            new PorterDuffXfermode(PorterDuff.Mode.DST_IN),            new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),            new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),            new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),            new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),            //相交为空            new PorterDuffXfermode(PorterDuff.Mode.XOR),            new PorterDuffXfermode(PorterDuff.Mode.DARKEN),            new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),            new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),            new PorterDuffXfermode(PorterDuff.Mode.SCREEN)

关于Activity的切换动画

overridePendingTransition(int enterAnim, int exitAnim),必须在Activity的startActivity和finish之后。
enterAnim:进入
exitAnim:离开

对于动画如果在TimerTask是无效的。需要用handler代替TimerTask

关于assets的文件问题

  • 只能读取,不能写入
  • 在webView中使用的路径是file:///android_asset/file_name.eof (End Over File,eof)
  • 打开assets文件不能使用file:///android_asset/file_name.eof,需要使用getAssets().open(file_name.eof);

注意对于WebView加载外部内存卡的文件使用的路径是: “file:///”+Enviroment.getExternalStorageDirectory().getPath()+”/file_name.eof”

对于AsyckTack的并发使用

使用并发启动:

//thread_pool_executor 执行者[ɪɡˈzɛkjʊtə]new AsyncTack().executeOnExecutor(AsyncTack.THREAD_POOL_EXECUTOR,value);

对于FragmentPageAdapter的一个问题

如果使用了compile 'com.android.support:design:23.2.0' 的TableLayout,不显示Tab的tile的话是因为没有在FragmentAdapter中重写:

            /**             * 必须实现该方法,要不不能显示title             * @param position             * @return             */            @Override            public CharSequence getPageTitle(int position) {                return tabTitles[position];            }

屏幕适配的种类

480x320
800x480
850x480
960x540
976x600
1080x672
1184x720
1205x800
1280x720
1280x800
1776x1080
1920x1080
2392x1440
默认使用1280x720的

对于EditText的键盘设置

通过属性imeOptions=“actionSearch”即可

0 0