整理的知识
来源:互联网 发布:姚金刚seo与网络营销 编辑:程序博客网 时间:2024/05/22 18:38
Framework
android应用框架层, 是Android系统四层架构的第三层.
- Linux内核(Linux Kernel)
- 中间层(android 的C/C++框架)
- 应用程序框架(Application Framework): 丰富而又可扩展性的视图(Views), 内容提供者(Content Providers), 资源管理器(Resource Manager), 通知管理器(Notification Manager), 活动管理器(Activity Manager)
- 应用程序 (Applications)
图片三层缓存
主要是为了解决图片下载流量和加载速度问题. 三层是内存/文件/网络. 重点在于内存: 使用LruCache存储URL和Bitmap.
int maxSize = (int) (Runtime. getRuntime(). freeMemory() / 4);mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap value) { return value. getRowBytes() * value. getHeight(); }};
OOM
内存溢出, 程序申请的内存大于系统可以分配的最大内存时出现爱你, 主要情景是应用需要加载大量较大图片时出现. 主要解决方式:
- 压缩图片或者采用较小的图片编码格式;
- 自定义内存分配(不root不能实现);
- 及时回收图像资源;
- 三级缓存, 主要是通过LruCache缓存到内存;
另外, 内存泄漏是指不使用的/包含Activity在内的某些对象资源得不到释放, 具体原因及对应解决办法:
- 单例持有Activity的context对象: 获取ApplicationContext;
- 非静态类中创建静态实例: 将内部实例类抽成单例;
- Hanlder/thread创建了匿名内部类, 导致Activity结束时, handler等仍持有Context对象.
解决办法:
构造函数中reference = new WeakReference<>(context)
, 使用(MainActivity) reference. get()
获取context, 并在onDestroy中mHandler. removeCallbacksAndMessages(null)/AsyncTask. cancel()
- 某些资源未关闭, 例如: BraodcastReceiver, ContentObserver, File, Cursor, Stream, Bitmap等, 在Activity退出时应及时关闭或注销;
ANR
Application not response. 主要有三种:
- KeyDispatchTimeout(5秒): 主要情况, 触摸或按键响应超时;
- BroadcastTimeout(10秒): 广播事件接收处理超时, onReceive执行超过10秒时出现;
- ServiceTimeout(20秒): 服务超时, 不常见;
主要原因:
- 当前的事件没有机会得到处理;
- 当前的事件正在处理,但没有及时完成;
解决办法:
耗时操作均放到单独线程中基本可以避免KeyDispatchTimeout.
四大组件,五大布局
Activity, Service, BroadcastReceiver, ContentProvider;
LinearLayout, RelativeLayout, TableLayout, FrameLayout, AbsoluteLayout;
远程服务
相关名词remote/AIDL, 具体实现步骤:
- 在工程src下新建本质为interface的
IFileCountService. aidl
文件; - 新建Service文件AService, 定义内部类继承AIDL文件自动生成的内部类Stub, 并且实现aidl文件中定义的接口, onbind返回Stub对象;
- 在Manifest文件中注册AService时添加
android: process=": remote", <intent-filter><action android: name=aidl文件路径/>
, 以便其他应用隐式调用; - 其他进程调用时: 新建
ServiceConnection
对象,onServiceConnected
实现方法中iService=IFileCountService. Stub. asInterface(service)
, 然后bindService(AService)
;
Activity生命周期
onActivityResult
执行在onStart之前, onSaveInstanceState
执行在onPause之前, onRestoreInstanceState
执行在onStart之后onResume之前, onRestart在onStart之前
解析json和xml
Gson库, XmlPullParse类, 但使用json更方便.
JNI&NDK
JNI: java native interface, java调用本地C/C++库;
NDK: native development kit, 方便开发jni的工具包.
具体步骤:
- java中定义native方法;
- 编译声称. h文件, 新建. c文件实现. h文件中声明的函数, 把. h和. c放入一个文件夹中;
- AndroidStudio配置NDK, 添加各种NDK配置, 即可编译出. so库.
动画
包括三种: View Animation
, Drawable Animation
, Property Animation
属性动画.
属性动画: 通过动画的执行类来设置动画操作的对象的属性、持续时间、开始和结束的属性值、时间差值等,然后系统会根据设置的参数动态的改变对象的属性。
相关属性:
- Duration: 持续时间;
- Time interpolation: 时间差值, 即动画变化率, 加速度;
- Repeat count and behavior: 重复次数和模式;
- Animator sets: 动画集合, 用于同时执行多个动画.
OOP面向对象
三大特性: 封装, 继承, 多态;
六大原则:
- 单一职责: 一个类要功能单一;
- 开放封闭: 扩展性开放, 更改性封闭;
- 里氏替换原则: 子类在任何位置都能替换父类;
- 依赖倒置原则: 具体依赖抽象, 上层依赖下层;
- 接口隔离原则: 模块间使用接口隔离, 避免类强耦合;
- 迪米特原则: 对象应对其他对象有最少的了解, 即对自己需要耦合或调用的类知道的最少;
java数据结构
类继承树:
- Collection
- List
- ArrayList: 不同步, get/set比LinkedList效率高;
- Vector: 同步;
- LinkedList: 频繁插入删除效率比ArrayList高;
- Set
- HashSet: 维护一个HashMap;
- TreeSet: 维护一个TreeMap;
- List
- Map: EntrySet的集合
- TreeMap: 自动按自然或自定义规则排列;
- HashMap: 无序, 但插入删除方便;
- LinkedMap: 按插入顺序排列;
屏幕适配
ImageView使用百分比, 图片适当使用大分辨率即可.
百分比适配, 可以使用鸿洋大神对官方percent-support-lib库的扩展库, github地址
WebView
对webview进行设置, 主要是缩放/javascript支持等;原生和js可以互相调用: webView. loadUrl("file: ///android_asset/android. html");
- 原生调用js方法:
webView. loadUrl("javascript: addHtmlNum()"); - js调用原生:
1. webView. addJavascriptInterface(new jsInterface(), "Android"); 2. jsInterface类中定义方法: @JavascriptInterface public void decNativeNum(){;} 3. js方法中: if (Android != null)Android. addNativeNum();
设计模式23种
- 观察者模式: 当被观察者Observable发生某些改变时, 通知观察者Observer进行某些操作的模式. 例如基本所有的listener, 包括Framework层, 再例如BroadcastReceiver, adapter. notifyDataSetChanged;
- 工厂模式: 新建对象需要进行大量初始化时使用, StaticClass. creatInstance的方式new Class, 把实例化延迟到子类中, 例如一个工厂生产不同类型的产品时:
Factory. create(XX. class);
public <T extend Product> T create(class<T> clz){
return (T)((XX)Class. forName(clz. getName()). newInstance());
} - 单例模式: 如果创建一个对象消耗资源过多时, 就需要考虑单例模式.
实现方式: 构造函数私有, 暴露getClass获取单例对象的接口. - 策略模式: 为了避免复杂的if-else处理, 定义抽象, 注入不同, 耦合度低, 但随着策略的增加, 子类会很多.
实现方式: 传入实现接口的不同类的对象, 调用接口的方法即可. - 适配器模式: 把某类的某接口变换成客户端所期待的另一种接口, 使原本接口不匹配的类能一起工作, 包括类适配器和对象适配器两种.
实现方式: 适配器adapter类实现客户端接口, 为其提供写好的接口方法, 然后类适配器会继承待适配类, 对象适配器会在内部新建待适配类对象.
GET&POST
GET查, POST改, PUT增, DELETE删. GET和POST区别:
- GET把参数包含在URL中, POST通过request body传递参数, 所以Post安全性更好;
- GET传递参数有长度限制;
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制;
其实两者都是TCP/IP链接, 本质上只有唯一一点不同: GET产生一个TCP数据包;POST产生两个TCP数据(网络环境不好时数据完整性好). 但由于HTTP的规定和浏览器/服务器的限制, 体现出了不同.
四种线程池:
- newCachedThreadPool(): 不限数量, 内部线程空闲60s后会被移除;
- newFixedThreadPool(): 限定数量, 一般用于较为稳定的线程, 且线程不会被移除;
- newScheduledThreadPool(): 调度, 内部线程可以依次延迟执行, 不会被移除;
- SingleThreadExecutor: 限制数目为1的newFixedThreadPool.
例, 建立线程数目为CPU个数的线程池:ExecutorService pool = Executors. newFixedThreadPool(Runtime. getRuntime(). availableProcessors());pool. submit(runnable);
hybrid
即NativeWeb混合应用, 目前主要有PhoneGap和AppCan.
工作中经验
- 工作中用到的设计模式: 读巡检任务数据库的RxJava观察者模式,
FragmentFactory
的单例模式/工厂模式,onActivityResult
的策略模式; - 工作中搭建的框架: GridView, 侧边栏;
- 工作中抽取的模块:
BaseHistoryChoiceActivity
,BaseWebActivity
,BaseWebDialog
,include的layout标题栏
等; - 工作中遇到的技术问题: 获取定位无限循环导致listview卡屏, Socket通信, 不能锁屏获取定位等;
热更新技术
QQ空间补丁/微信Tinker/阿里AndFix, 前两者可以增删类/资源, 后者对性能无损耗, 并能及时生效, 无需重启应用.
AndFix傻瓜式引入: import, application初始化, apkpatch生成补丁, 下载至sd卡, 即可修复bug
.
组件化&插件化:
组件化: 主要是方便开发时单独编译某一部分, 提高编译效率, 但是组件之间的通信可能需要引入外部库支持.
插件化: 按需下载模块, 避免过多无用功能. 主要有两种, 一种是apk插件, 一种是dex插件. 比较容易实现的是apk插件(主应用使用ComponentName调用插件apk), 但是需要安装, 有被外部启动的风险.
Android图片颜色格式
- ALPHA_8: 1byte;
- ARGB_4444: 2byte;
- ARGB_8888: 4byte;
- RGB_565: 2byte.
Handler
在Activity中新建的handler持有ActivityUI线程的MessageQueue,在某Thread中新建的Handler持有该Thread线程的消息队列。所以在Activity中新建的Handler持有Context对象,会造成内存泄漏。
APP框架
- v4.ViewPager+MainPagerAdapter+v7.ToolBar
- RecyclerView实现GridView九宫格+FlowingDrawer侧边栏
手势
implements android.view.GestureDetector.OnGestureListener;
detector = new GestureDetector(this,this); //创建手势检测器
//将该activity上的触碰事件交给GestureDetector处理
public boolean onTouchEvent(MotionEvent me){
return detector.onTouchEvent(me);
}@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
...
}
Service
Service类似于没有界面的Activity,既不是进程也不是线程。Service优先级比Activity要高,即使被杀死也会自己启动(在startCommand中配置)。
- 整理的知识结构图
- lucene知识的整理
- Ajax的知识整理
- 整理的知识
- 服务端知识的整理
- 关于日期知识的整理
- 网速的一些知识整理
- XML杂乱的知识整理
- 开始整理我的知识
- 我的知识来源整理
- 学会整理自己的知识
- 整理android java 的知识
- 整理View的相关知识
- VC 宏 知识的整理
- 零散的汇编知识整理
- 进程相关知识的整理
- 别人整理的前端知识
- Thread类的知识整理
- fasterrcnn测试
- 每天一个 Linux 命令(45):free 命令
- 【流媒体技术】流媒体(2)使用ffmpeg推流
- mybaits映射关系整理
- mybaites 入门到精通
- 整理的知识
- C++中读写txt文件并分离字符
- js交互 webiview点击事件获取android的方法
- 一个优秀的Android应用从建项目开始
- 二叉树定义与存储
- HTML5 Canvas处理头像上传
- SQLAlchemy Object Relational Tutorial
- PCIe学习笔记(11)--- 配置空间的读写请求
- Android 屏幕适配方案