今日头条屏幕适配框架AndroidAutoSize-原理

对于AndroidAutoSize SDK,需要明确一下几个点的实现原理:

1.AndroidAutoSize的无侵入启动原理:

autosize模块的AndroidManifest中注册了一个provider(InitProvider)

由于一个应用程序的启动,伴随着ActivityThread的启动,在ActivityThread创建和启动过程中会去创建和初始化注册的contentprovider,流程:

今日头条屏幕适配框架AndroidAutoSize-原理_第1张图片

从流程中可以看出,注册了的ContentProvider 会在应用启动的时候就创建并初始化好了,并且调用了onCreate()方法,这是一种无侵入的做法。ContentProvider的onCreate方法的执行要先于Application的onCreate方法。

这么一来,AndroidAutoSize的一些初始化工作就可以放在ContentProvider.onCreate()里面了。

2.Activity和Fragment自动开始实现适配逻辑:

(1)Application有一个方法registerActivityLifecycleCallbacks(),设置监听Activity的生命周期。这个原理就是在Application中保存ActivityLifecycleCallbacks的一个集合,并且在Activity生命周期方法onCreate、onStart、onResume、onPause、onStop、onDestroy等执行的时候,去掉用Application的ActivityLifecycleCallbacks中对应的方法。(这里注意:不是Application去调用Activity生命周期的方法,并且去调用ActivityLifecycleCallbacks的方法。因为Activity生命周期的方法是Instrumentation去调用的)。然后Activity的onCreate方法、onStart方法或Fragment的onCreate方法执行的时候去执行监听的applyAdapt方法去配置适配的规则。

(2)一个应用的Application的实例的获取:一般情况下,ContentProvider执行onCreate方法的时候,Application类对象已经完成了创建和初始化了,并且能够通过ContextImpl拿到(从LoadedApk或者ActivityThread中获取Application)。如果拿到的Application是空的,也可以通过反射拿到,先通过静态方法ActivityThread.currentActivityThread()拿到静态单例对象ActivityThread sCurrentActivityThread(每个应用对应一个ActivityThread对象),然后通过ActivityThread对象的getApplication方法拿到Application对象。

3.默认情况下,所有的Activity都会使用这个默认适配规则,那么如何指定哪些Activity要放弃适配或者自定义适配?

如果对于指定的Activity要放弃适配,就需要对这个Activity实现CancelAdapt接口,在执行applyAdapt方法时判断这个Activity是否实现了CancelAdapt,来判断是否放弃适配规则。

如果对于指定的Activity要自定适配,跟上面原理一样,需要实现的接口是CustomAdapt。

4.对于使用了第三方库里面的Activity,怎么取消适配:

明确需要屏蔽适配规则的所有Activity,将所有Activity的class保存在一个集合中,当执行applyAdapt方法时,判断当前的Activity的名字是否在这个集合中,如果是则取消适配规则。注意:这里目前还只能取消第三方库中的Activity,暂时还不支持取消Fragment的适配规则。

5.适配的本质:

由于手机的屏幕大小,像素密度等不同,相同的大小dp的控件在不同手机上显示可能存在偏差,要保证dp的”正确性“,就需要从dp计算原理着手(不管什么单位最后都会转换成px来进行绘制,其他单位原理大同小异)。

计算公式:

density = densityDpi / 160;

px = density * dp;

因此这里的主要工作就是修改DisplayMetrics中的density和densityDpi的值。DisplayMetrics获取的方法:Activity.getResources().getDisplayMetrics();

你可能感兴趣的:(安卓开发)