android 知识点整理

1、Handler原理

handler类中有Looper、messageQueue、message,构造方法中会初始化这些变量

调用Looper.perpare方法中利用静态threadlocal存放looper对象,Looper类中有messageQueue,messageQueue中存放message队列。

调用Looper.looper方法执行while(true)循环,从messageQueue中取出message,而message中有个targer变量指向Handler,调用Handler的handleMessage方法。因此Handler在哪个线程创建的,handlerMessage方法便会在哪个线程执行,子线程更新UI可以用如下:

public class ThreadDemo extends Thread{
    public void run(){
        Looper.prepare();
        Handler handler = new Handler(){
           public void handlerMessage(Message msg){
               //执行UI更新
            }
        };
        Looper.loop();
    }
}

针对while(true)循环不会过度消耗cpu的问题,Activitythread中,Looper.looper方法一直从MessageQueue中取下一个message,取到后执行主线程的生命周期等,关键在于Message msg = queue.next();next方法是通过调用nativePollOnce()这个navtive方法造成了阻塞,阻塞最终是通过linux的epoll机制实现,管道等待的时候并不会耗cpu。

2、app插件化机制:

java 的classLoader有双亲委托机制,加载类时先查看自身是否加载过,再通过父加载器加载,最后通过findClass加载class文件

父类关系为BootStrap->ExtClassClassLoader->AppClassLoader

android 的classLoader有BaseClassLoader,因为Android解析的是dex文件,所以无法直接使用java的classLoader进行类加载,这里BaseClassLoader由两个子类,DexClassloader和PathClassloader,而DexClassLoader可以加载为被安装的dex文件。

插件化使用主要解决4大组件及资源加载的问题,

代理模式:启动插件apk的Activity,需要绕过AndroidMainfest检测,通过插桩的形式,注册一个ProxyActivity,Intent参数中传递真正的Activity,而真正需要创建的Activity需要继承proxyActivity,创建的时候需要利用Activity的反射方法,传入classloader,调用ProxyAcitivity的生命周期时,实际会调用参数Activity的生命周期,此方法代码侵入性强,this对象会变化,Activity启动模式不易管理。

Hook模式:自定义Instrumentation,反射替换系统的Instrumentation,重写execStartActivity方法,virtualApk的方式,通过markIntentIfNeeded方法将检测AndroidManifest的类改为检测已注册的activity,最后在newActivity的时候使用Intent传入的参数activity。

资源文件的插件化:

针对resource对象,Resource的构造方法需要AssetsManager,而AssetsManager的addAssetPath方法添加资源目录,可以做到资源文件的添加,插件和宿主都可以访问,此为合并式,也可以独立进行自己的访问

一般通过context对象,拿到resource对象,因此resource对象可分为以上两种,合并式需要通过hook主工程的resource,通过反射将插件resource对象添加进去,而独立式则返回自身的resource对象即可,最后将新的resource和Activity进行关联,合并式会存在资源id冲突的问题,要么去修改aapt打包工具,要么修改resource.resc文件,一般应用资源修改0X7f,可以改为自己的。

3.Https

服务器存放私钥,公钥存放客户端

4、数据库事务

原子性、一致性、隔离性、持久性

5、Lrucache原理:

三级缓存,先从内存缓存,再到硬盘缓存,一般内存为进程内存的1/8为上限,内部主要采用Linkhashmap,算法为最少使用次数。Linkhashmap的put方法将一个key和value放入,此时对于一个新值来说,都是一样的,双链表的顺序也是挨个去放,get的时候重新排序,将最久访问的放在队尾。

6、surfaceView

surfaceview单独启动一个线程刷新界面,一般通过lockCanvas锁定画布,接着在画布上进行绘制,最后通过unlockCanvasAndPost进行提交

7、自定义ViewGroup

下拉刷新SmartRefreshView,列表平滑删除SwipeMenuView,主要在onMeasure、onLayout 、onDraw中进行处理

8、Sophix热修复

DexClassLoader加载dex文件,通过Element的findClass找到对应的类,而热修复就是利用classloader的双亲委托机制,替换找的过程,用新的class文件,放在classLoader遍历的顶部,或者替换旧的class文件实现加载

9、内存泄漏

主要是生命周期不一致导致的

静态context,handler、http请求context,非静态内部类,文件读写关闭,bitmap释放

10、组件化思想

11、jvm内存模型

栈、堆、程序计数器、本地方法区(Native)、方法区、常量池

12、Activity4中启动模式

standard 默认启动模式,生成新的

singleTop 若栈顶存在,则直接用,若没有或者不在栈顶,创建新的,会调用onNewIntent

singleTask 若栈中有,直接放到栈顶,并清空上面的所有activity,会调用onNewIntent

singleInstance 系统层用的多,多进程共享一个,如laucher

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值