整理的知识

来源:互联网 发布:姚金刚seo与网络营销 编辑:程序博客网 时间:2024/05/22 18:38

Framework

android应用框架层, 是Android系统四层架构的第三层.

  1. Linux内核(Linux Kernel)
  2. 中间层(android 的C/C++框架)
  3. 应用程序框架(Application Framework): 丰富而又可扩展性的视图(Views), 内容提供者(Content Providers), 资源管理器(Resource Manager), 通知管理器(Notification Manager), 活动管理器(Activity Manager)
  4. 应用程序 (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

内存溢出, 程序申请的内存大于系统可以分配的最大内存时出现爱你, 主要情景是应用需要加载大量较大图片时出现. 主要解决方式:

  1. 压缩图片或者采用较小的图片编码格式;
  2. 自定义内存分配(不root不能实现);
  3. 及时回收图像资源;
  4. 三级缓存, 主要是通过LruCache缓存到内存;

另外, 内存泄漏是指不使用的/包含Activity在内的某些对象资源得不到释放, 具体原因及对应解决办法:

  1. 单例持有Activity的context对象: 获取ApplicationContext;
  2. 非静态类中创建静态实例: 将内部实例类抽成单例;
  3. Hanlder/thread创建了匿名内部类, 导致Activity结束时, handler等仍持有Context对象.
    解决办法:
    构造函数中reference = new WeakReference<>(context) , 使用(MainActivity) reference. get()获取context, 并在onDestroy中
    mHandler. removeCallbacksAndMessages(null)/AsyncTask. cancel()
  4. 某些资源未关闭, 例如: BraodcastReceiver, ContentObserver, File, Cursor, Stream, Bitmap等, 在Activity退出时应及时关闭或注销;

ANR

Application not response. 主要有三种:

  1. KeyDispatchTimeout(5秒): 主要情况, 触摸或按键响应超时;
  2. BroadcastTimeout(10秒): 广播事件接收处理超时, onReceive执行超过10秒时出现;
  3. ServiceTimeout(20秒): 服务超时, 不常见;

主要原因:

  1. 当前的事件没有机会得到处理;
  2. 当前的事件正在处理,但没有及时完成;

解决办法:
耗时操作均放到单独线程中基本可以避免KeyDispatchTimeout.


四大组件,五大布局

Activity, Service, BroadcastReceiver, ContentProvider;
LinearLayout, RelativeLayout, TableLayout, FrameLayout, AbsoluteLayout;


远程服务

相关名词remote/AIDL, 具体实现步骤:

  1. 在工程src下新建本质为interface的IFileCountService. aidl文件;
  2. 新建Service文件AService, 定义内部类继承AIDL文件自动生成的内部类Stub, 并且实现aidl文件中定义的接口, onbind返回Stub对象;
  3. 在Manifest文件中注册AService时添加android: process=": remote", <intent-filter><action android: name=aidl文件路径/>, 以便其他应用隐式调用;
  4. 其他进程调用时: 新建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的工具包.

具体步骤:

  1. java中定义native方法;
  2. 编译声称. h文件, 新建. c文件实现. h文件中声明的函数, 把. h和. c放入一个文件夹中;
  3. AndroidStudio配置NDK, 添加各种NDK配置, 即可编译出. so库.

动画

包括三种: View Animation, Drawable Animation, Property Animation属性动画.
属性动画: 通过动画的执行类来设置动画操作的对象的属性、持续时间、开始和结束的属性值、时间差值等,然后系统会根据设置的参数动态的改变对象的属性。
相关属性:

  • Duration: 持续时间;
  • Time interpolation: 时间差值, 即动画变化率, 加速度;
  • Repeat count and behavior: 重复次数和模式;
  • Animator sets: 动画集合, 用于同时执行多个动画.

OOP面向对象

三大特性: 封装, 继承, 多态;
六大原则:

  1. 单一职责: 一个类要功能单一;
  2. 开放封闭: 扩展性开放, 更改性封闭;
  3. 里氏替换原则: 子类在任何位置都能替换父类;
  4. 依赖倒置原则: 具体依赖抽象, 上层依赖下层;
  5. 接口隔离原则: 模块间使用接口隔离, 避免类强耦合;
  6. 迪米特原则: 对象应对其他对象有最少的了解, 即对自己需要耦合或调用的类知道的最少;

java数据结构

类继承树:

  1. Collection
    1. List
      1. ArrayList: 不同步, get/set比LinkedList效率高;
      2. Vector: 同步;
      3. LinkedList: 频繁插入删除效率比ArrayList高;
    2. Set
      1. HashSet: 维护一个HashMap;
      2. TreeSet: 维护一个TreeMap;
  2. Map: EntrySet的集合
    1. TreeMap: 自动按自然或自定义规则排列;
    2. HashMap: 无序, 但插入删除方便;
    3. LinkedMap: 按插入顺序排列;

屏幕适配

ImageView使用百分比, 图片适当使用大分辨率即可.
百分比适配, 可以使用鸿洋大神对官方percent-support-lib库的扩展库, github地址


WebView

对webview进行设置, 主要是缩放/javascript支持等;原生和js可以互相调用:
webView. loadUrl("file: ///android_asset/android. html");

  1. 原生调用js方法:

    webView. loadUrl("javascript: addHtmlNum()");
  2. js调用原生:
    1. webView. addJavascriptInterface(new jsInterface(), "Android");    2. jsInterface类中定义方法:         @JavascriptInterface        public void decNativeNum(){;}    3. js方法中: if (Android != null)Android. addNativeNum();

设计模式23种

  1. 观察者模式: 当被观察者Observable发生某些改变时, 通知观察者Observer进行某些操作的模式. 例如基本所有的listener, 包括Framework层, 再例如BroadcastReceiver, adapter. notifyDataSetChanged;
  2. 工厂模式: 新建对象需要进行大量初始化时使用, 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());
    }
  3. 单例模式: 如果创建一个对象消耗资源过多时, 就需要考虑单例模式.
    实现方式: 构造函数私有, 暴露getClass获取单例对象的接口.
  4. 策略模式: 为了避免复杂的if-else处理, 定义抽象, 注入不同, 耦合度低, 但随着策略的增加, 子类会很多.
    实现方式: 传入实现接口的不同类的对象, 调用接口的方法即可.
  5. 适配器模式: 把某类的某接口变换成客户端所期待的另一种接口, 使原本接口不匹配的类能一起工作, 包括类适配器和对象适配器两种.
    实现方式: 适配器adapter类实现客户端接口, 为其提供写好的接口方法, 然后类适配器会继承待适配类, 对象适配器会在内部新建待适配类对象.

GET&POST

GET查, POST改, PUT增, DELETE删. GET和POST区别:

  1. GET把参数包含在URL中, POST通过request body传递参数, 所以Post安全性更好;
  2. GET传递参数有长度限制;
  3. 对参数的数据类型,GET只接受ASCII字符,而POST没有限制;
    其实两者都是TCP/IP链接, 本质上只有唯一一点不同: GET产生一个TCP数据包;POST产生两个TCP数据(网络环境不好时数据完整性好). 但由于HTTP的规定和浏览器/服务器的限制, 体现出了不同.

四种线程池:

  1. newCachedThreadPool(): 不限数量, 内部线程空闲60s后会被移除;
  2. newFixedThreadPool(): 限定数量, 一般用于较为稳定的线程, 且线程不会被移除;
  3. newScheduledThreadPool(): 调度, 内部线程可以依次延迟执行, 不会被移除;
  4. 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图片颜色格式

  1. ALPHA_8: 1byte;
  2. ARGB_4444: 2byte;
  3. ARGB_8888: 4byte;
  4. RGB_565: 2byte.

Handler

在Activity中新建的handler持有ActivityUI线程的MessageQueue,在某Thread中新建的Handler持有该Thread线程的消息队列。所以在Activity中新建的Handler持有Context对象,会造成内存泄漏。


APP框架

  1. v4.ViewPager+MainPagerAdapter+v7.ToolBar
  2. RecyclerView实现GridView九宫格+FlowingDrawer侧边栏

手势

  1. implements android.view.GestureDetector.OnGestureListener;
  2. detector = new GestureDetector(this,this); //创建手势检测器
  3. //将该activity上的触碰事件交给GestureDetector处理
    public boolean onTouchEvent(MotionEvent me){
    return detector.onTouchEvent(me);
    }
  4. @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    ...
    }

Service

Service类似于没有界面的Activity,既不是进程也不是线程。Service优先级比Activity要高,即使被杀死也会自己启动(在startCommand中配置)。

0 0
原创粉丝点击