技术总结

2019-03-08  本文已影响0人  ben大福

   随便写点技术总结,不知道若干年后会不会有用

androidframwork

    service

        startService 启动的生命周期 oncreate->onStartCommand->ondestory 必须通过stopSelf() 或 stopService()停止服务

            多次启动会多次调用onStartCommand

        bindService  启动的生命周期 oncreate->onbind->onunbind-ondestory 执行完成自动停止服务

        https://blog.csdn.net/carson_ho/article/details/53160137

        https://www.jianshu.com/p/95ec2a23f300

    ipc  管道,socket通信,消息队列,binder机制通信(android)

        binder,内存映射 ,https://melonwxd.github.io/2017/10/28/android-ipc2/

        消息队列 远程service中handler,message,messagequeue,looper

    应用如何启动

        click调用startActivity(intent)-->通过Binder IPC机制调用activityManagerService

        -->调用grantUriPermissionLocked()判断是否有足够的权限调用activity

        -->判断ProcessRecord是null, ActivityManagerService会创建新的进程来实例化目标activity

        -->bindApplication 发送BIND_APPLICATION到消息队列

        -->通过handleBindApplication调用makeApplication加载app的class到内存中

        -->调用realstartactivity-->application线程中的sheduleLaunchActivity发送LAUNCH_ACTIVITY消息

        通过handleLaunchActivity()来启动activity

    应用如何加载资源

        Contentxt中有单例ResourcesManager->单例方式或去resResource

        resResource初始化 public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config)方法

        assetsManager会加载资源文件

    handler原理

    jni通信  c层调用java层是用反射调用的

    点击事件分发

        oninterceptertouchevent()  (viewgroup独有的,onIntercepter返回true,会调用onTouchEvent,如果返回false,执行子view的dispatch事件)

        onDispatherTouchEvent()  (ondispatch返回true,会调用onIntercepter,返回false调用子viewdispatch事件)

        onTouchEvent();

    mesure过程

        https://juejin.im/post/5ad37c476fb9a028bc2e32af

        调getRootMeasureSpec()根据DecorView的Layoutparams和手机屏幕宽高生成DecorView的MeasureSpec

        ViewRootImpl.performTraversals()->performMesure()->

        然后调用measure调用开始测量

        DecorView.measure()->onMeasure():

        ps。如果子viewGroup没有重写measure方法,子view不会被测量,  这个viewGroup没有设置具体的宽高的话,(wrapcontent)则viewgroup就显示父容器的宽高

        ps。getChildMeasureSpec()主要是通过父容器的MeasureSpec以及子view的宽高共同决定的

    jetpack

        databind  https://juejin.im/post/5b02cf8c6fb9a07aa632146d

        lifecycle 26.1.0 AppCompatActivity已经实现,若没有则自定义

        livedata https://juejin.im/post/5bfb4d6a6fb9a049df23bc98  https://www.jianshu.com/p/29c715bbf9f0

        navigation

        paging https://juejin.im/entry/5b0d3b0251882532321468ff

        room

        viewmodel https://juejin.im/post/5a040585f265da43346f5d57

        workmanager

    android打包过程

        https://juejin.im/entry/58b78d1b61ff4b006cd47e5b

        1,aapt打包资源文件,R.java  生成的resources.arsc和res文件、assets文件

        2, 处理aidl生成对应的java接口

        3,通过javacompile生成对应的class文件

        4,通过dex命令把生成class文件和外部的class文件处理生成dex文件

        5,通过apkbuilder把资源文件和dex文件打包成apk

        6,jarsigner工具,把apk打包签名

        7,通过zipalign,进行apk对齐处理

应用项目中使用

    glide

    okhttp

        okio 底层基于okio

        OkHttpClient

        call

        Dispatcher

        Interceptor

    rxjava

    kotlin

    websocket

    x509trustmanager服务器双向认证

    processor原理与优缺点

        缺点是不能插入代码,生成代码要在自己应用中调用

    内存优化

        profile,leakcanary,  traceview,blockcanary

java基础

    hashmap与linkedhashmap对比 (linkedhashmap继承于hashmap)

    hashmap与ConcurrentHashMap,hashtable对比

    java中有几种线程池 

        CachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

        FixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

        ScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行

        SingleThreadExecutor: 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行

    sparseArray

        SparseArray和ArrayMap都用来替换HashMap

        适合数据量小,千级以内。过大会降低性能

        均使用二分法查找数据

        hashmap扩容会占用更多的内存

        sparseArray的key为int,ArrayMap的key为对象

    抽象类与接口区别  https://www.jianshu.com/p/038f0b356e9a

    多态的表现形式 https://blog.csdn.net/lingang1991/article/details/69905944

算法

上一篇下一篇

猜你喜欢

热点阅读