Android开发的一些知识点(随时更新)

 一、 布局篇

1.1 RelativeLayout会执行2次onMeasure函数, 一次是横向测量、一次是纵向测量。因此建议尽量使用LinearLayout。

1.2 LinearLayout如果子View没有layout_weight属性则执行1次onMeasure函数; 如果设置了layout_weight属性则执行2次onMeasure, 第一次测量没有layout_weight属性的子view, 第二次测量有layout_weight属性的子view。

1.3 对于复杂的布局xml使用include分拆成若干个xml,  这对于性能没有优化,  只是看起来更有层次,   抽出的xml布局文件也可复用到其它地方;

1.4 使用ViewStub关键字设置扩展的布局,    该关键字不会真正的绘制,  所以对性能没影响;

1.5 使用automakeviewer查看布局, 尽量减少层级。  对于只有一个子View/ViewGroup的节点,  建议使用merge关键字减少一级;

1.6 ListView使用ViewHolder,  inflate和findviewById都比较耗时;

1.7 ListView快划时暂停下载图片的线程,  可以使用占位符图片;  如果使用了CursorAdapter,  建议使用BaseAdapter替换,  将cursor数据缓存到ArrayList中, 没当划到接近末尾位置时获取下一批数据(或其它数字)。

1.8 TextView设置android:backgroud属性实现背景点击时变色, 设置android:color属性实现文字点击时变色;

1.9 selector的xml里要将选中变色的item放在最前面, 否则不会有选中变色效果。

1.10 TextView使用\u3000占位, 即中文的空格。

1.11 应用首页Activity的launchmode属性使用singleTask, 覆盖onNewIntent函数并通过intent参数里的flag实现相关逻辑。


二、数据库篇

2.1 大批量插入数据(例如插入1000条联系人)时使用ContentProvider的bulkinsert方法, 减少aidl接口的调用; 在bulkinsert函数里使用事务Transaction。

2.2  建表时如果各表有关联, 可创建触发器Trigger来实现更新其它表的动作。

2.3  建表时主键一定是id Integer primary key  autoincrement,  即int型自增1的主键。

2.4  可以将java对象读写到表, 将java对象序列化为二进制格式存到sqlite的text类型字段, 从表里读取后反序列化并强转为对象。   这个特性很重要, 可以减少json解析的时间和读写的操作。

2.5 使用StrictMode即严苛模式可以检查cursor泄漏。

2.6 SQLiteOpenHelper.java的geWritableDatabase函数是线程安全的, getReadableDatabase线程不安全。


三、设计模式

3.1  ListView、GridView都是基于MVC模式, 即Model-View-Controller。 缺点是耦合性过强, 例如可以在Activity里修改Adapter的数据, 导致ListView/GridView显示的view不是它的数据。

3.2  目前互联网app建议使用MVP模式, Model-View-Presenter, 优点是分层解耦。

3.3  MVC、MVP和MVVM模式, 建议使用MVP, 分层和操作更灵活。 MVP会相互引用,注意在onDestroy函数里重置为单向引用。


四、插件化

4.1 使用PathClassLoader、DexClassLoader加载.class,  如果一个apk里多次加载同一个.class, 以第一次加载的为准。

4.2 动态代理, 使用Proxy和InnovationHandler代理ActivityManagerService, 从而打开有生命周期的Activity/Fragment/Service。 


五、三方库

5.1  图像相关主流开源框架有Fresco、Glide、Piccasso、ImageLoader, 建议使用Fresco或Picasso。

5.2 http通讯相关建议使用OkHttp或Volley。

5.3  抓日志有Countly、友盟、Bugly、Fabric等等;

5.4  数据库主流开源框架greenDao、ormLite、LitePal等, 如果手机端数据量小推荐使用LitePal,  理由是LitePal使用更方便。


六、生成apk

6.1  如果可能,尽量使用体积小的三方库;

6.2 删除冗余资源和代码, 推荐使用LintCleaner工具;

6.3 按照Google IO会议的说法,  建议图片从高到低的格式为:VectorDrawable-WebP-Png-Jpeg

6.4 使用友盟、mulchannel等等三方工具生成渠道包。  渠道包apk的根目录里会多个文件,   内容是渠道名称字符串。


七、Java基础

7.1 ArrayList基于数组,   在插入元素时判断大小即将越界时新建个数组,比现有大小多半倍,并使用System.arraycopy函数拷贝数据;插入O(1), 读取O(1),删除O(n)。

7.2 LinkedList基于链表, 有头结点、尾结点。 插入时间复杂度O(1),查询O(n),删除O(1)。

7.3 Java内部类能访问外部类的对象是因为内部类保存了外部类的引用。

7.4 多线程并发时建议使用ConcurrentHashMap替换HashMap, 因为CocurrentHashMap把Map分拆成若干个Segment, 调用hashcode方法判断在哪个Segment里, 每个Segment就是一个同步锁, 默认比HashMap性能提高16倍。

7.5 多线程时数据保存在寄存器,  要使用volatile关键字强制刷新不同线程的变量。

7.6 HashMap的核心函数hashcode和equals,  工作原理是内部维护一个Set数组,是个散列表(链式,哈希值相同时使用链表方式)。使用散列函数hashcode确定每个key在数组中的下标,读取时间复杂度O(1),写的时间复杂度是O(1)。

7.7  匿名内部类就编译后以$和数字命名。   比如ATest$1.class。

7.9  final放到变量前表示常量, final放到函数表示不能被派生类覆盖,final放到类前表示该类不能被继承。

7.10 void是无返回值, Void是不能被实例化到类,保存了一个引用代表了Java关键字void的Class对象。 在AsyncTask里用的了。

7.11 泛型的含义表示泛型必须实现了接口Comparable, &在泛型里是类和接口的连接符, 可以写成表示泛型T的上限或下限, 即必须是SomeClass及派生类或超类;?是泛型的通配符。



八、Android基础

8.1  点击桌面的app图标执行时序是, Application的onCreate函数、Launcher属性的Activity生命周期。 三方库的初始化要放在Application的onCreate函数里。

8.2   在AndroidManifest.xml可以指定进程android:process=":remote", 即设置remote进程。  它的进程名称格式是包名:remote, 例如com.android.contacts:remote。

8.3  使用插件FindBugs、CheckStyle做静态代码走查。

8.4 使用MAT分析hprof文件, 查找内存泄漏的原因。

8.5 使用ButterKnife绑定xml布局为View引用。

8.6 GPU刷新屏幕的周期是16ms, 出现界面卡顿时实际上是丢帧了。 

8.7 多次调用onDraw会被系统认为是过度渲染。打开“显示Surface刷新”选项, 红色区域就是刷新了多次。

8.8 使用StaticLayout类判断TextView占用几行, 在设置TextView居中对齐/左对齐时会用到。

8.9 Android进程通讯有6种方式, 即Intent、BroadCast、AIDL、Content Provider、Messager、LocalSocket等;

8.10 Activity渲染完成通过onWindowFocusChanged函数判断。

8.11 onResume和onStart的区别是onStart没焦点,onResume有焦点, 相同点是界面都显示出来了


九、网络相关

9.1 OSI七级模型,  从上到下为应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。

9.2 目前在用HTTP协议版本号大多为1.1,很小部分为1.0。

9.3 HTTP有8个方法, 分别为POST, GET, OPTION, DELETE, UPDATE, HEAD,TRACE和CONNECT.

9.4 断点续传的http请求包必须包含Content-Range字段。

9.5 POST比GET更安全, 理由是GET将参数放在url后面, 在浏览器里能看到; POST将参数放到HTTP包体里。  其实然并卵,  抓包都能看到。

9.6 手机端和服务器交互验签,  先将包体的key-value排序然后计算MD5, 并放到sign变量里。


      我的微信公众号, 欢迎关注, 让我们一起成长

                          Android开发的一些知识点(随时更新)_第1张图片




你可能感兴趣的:(Android)