Android笔记

来源:互联网 发布:倩女幽魂mac可以玩吗 编辑:程序博客网 时间:2024/06/05 17:14

1.在设置按钮背景图片时,尽量使用占用空间小的图片,这是因为Android系统在执行Oncreat方法时 绘制VIew,要把对应的背景图片解析成bitmap放在内存中,如果图片过大,会导致解析的进程耗时过长,因为setcontent是在UI线程中,所以会导致卡顿。

2.R.drowable下的文件加载通常不会导致OOM,因为Android系统有一定机制。

3.养成Bipmap使用完recycle的好习惯,一般Android内存中使用的对象再多都不会导致OOM。然而Bitmap例外,Bitmap在内存中的存储格式为byre[],我们使用mat软件进行内存分析即可看到,Bitmap占用了系统分配的很大内存空间。

4.安卓系统设置延迟功能代码:

SystemClock.sleep(1000);

会使代码运行到这里窗【冻结】1秒如果超过15秒会导致ANR;
延迟执行但是不会导致ANR的代码:

new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {            textview.settext("刷新成功"//5秒后执行                    }                }, 5000);

5.drawerlayout 设置主内容与菜单之间颜色透明Mydrawer.setScrimColor(Color.TRANSPARENT);

6.ListView使用ViewHolder极简写法

public static <T extends View> T getAdapterView(View convertView, int id) {        SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();        if (viewHolder == null) {            viewHolder = new SparseArray<View>();            convertView.setTag(viewHolder);        }        View childView = viewHolder.get(id);        if (childView == null) {            childView = convertView.findViewById(id);            viewHolder.put(id, childView);        }        return (T) childView;    }

用法:

@Override    public View getView(int position, View convertView, ViewGroup parent) {        if (convertView == null) {            convertView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_feed_item, parent, false);        }        ImageView thumnailView = getAdapterView(convertView, R.id.video_thumbnail);        ImageView avatarView =  getAdapterView(convertView, R.id.user_avatar);        ImageView appIconView = getAdapterView(convertView, R.id.app_icon);

7.

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);//切换到非全屏        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//切换到全屏        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//清除         getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//透明状导航栏           如果4.4的机器设置透明状态栏白条,则需要在XML里设置去掉以下两个属性:     android:clipToPadding="true"    android:fitsSystemWindows="true"

8.像素转dip

 public int DipToPixels(Context context, int dip) {        final float SCALE = context.getResources().getDisplayMetrics().density;        float valueDips = dip;        int valuePixels = (int) (valueDips * SCALE + 0.5f);        return valuePixels;    }

dip转像素

 public static float PixelsToDip(Context context,int Pixels) {  final float SCALE = context.getResources().getDisplayMetrics().density;  float dips =Pixels / SCALE ;  return dips; }

9.在那里startActivityForResult就在哪里写回调onActivityResult ,例如在Fragment1里写startActivityForResult,回调方法onActivityResult 就要写在Fragment1里。

10.一、ActivityManagerService提供的主要功能:
(1)统一调度各应用程序的Activity
(2)内存管理
(3)进程管理
当用户单击某个应用图标后,执行程序会在该图标的onClick()事件中调用startActivity()方法,该方法会调用startActivityForResult(),在这个方法内部会调用Instrumentation对象的executeStartActivity()方法,每个Activity内部都有一个Instrumentation对象的引用,它就是一个管家,ActivityThread要创建或者暂停某个Activity都是通过它实现的。

11.介绍下实现一个自定义view的基本流程
明确需求,确定你想实现的效果 2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单, 参考 3.如果是完全自定义一个view的话,你首先需要考虑继承哪个类,是View呢,还是ImageView等子类。 4.根据需要去复写View#onDraw、View#onMeasure、View#onLayout方法 5.根据需要去复写dispatchTouchEvent、onTouchEvent方法 6.根据需要为你的自定义view提供自定义属性,即编写attr.xml,然后在代码中通过TypedArray等类获取到自定义属性值 7.需要处理滑动冲突、像素转换等问题

12.可见,Java较Native端实现简单很多,通过Aidl工具来实现类似功能。所以,要实现一个Java端的service,只需要做以下几件事情:

1.写一个.aidl文件,里面用AIDL语言定义一个接口类IXXX。

2.在Android.mk里加入该文件,这样编译系统会自动生成一个IXXX.java, 放在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core 下面。

3.在服务端,写一个类,扩展IXXX.Stub,具体实现IXXX的接口函数。

Android线程间通信的基本方式
使用管道流Pipes
共享内存
使用Hander和Message

本文原创,转载请说明出处,谢谢。

0 0
原创粉丝点击