
Android
wby93
这个作者很懒,什么都没留下…
展开
-
ARouter执行流程分析
一.初始化ARouter的初始化通过执行ARouter.init(Application application)完成,ARouter具体实现由_ARouter完成。//ARouter.initpublic static void init(Application application) { //是否初始化 if (!hasInit) { logger = _ARouter.logger; _ARouter.logger.info(Consts.TAG原创 2020-08-15 00:14:30 · 357 阅读 · 0 评论 -
Dagger2的使用
一.@Inject1.用户自定义的类在构造函数使用@Inject注解。public class Student { @Inject public Student(){ }}2.新建一个接口,名称一般以Activity名称加Component组成,使用@Component修饰,其中包含一个injectTo方法,表示将对象注入到某个类中。@Componentpublic interface Test1ActivityComponent { void injectT原创 2020-08-11 00:35:38 · 257 阅读 · 0 评论 -
Jetpack组件之LiveData解析
LiveData执行流程LiveData通过observe添加观察者,方法如下:@MainThreadpublic void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) { //判断是否在主线程 assertMainThread("observe"); //判断LifecycleRegistry的状态 if (owner.getLifecycle().g原创 2020-08-01 09:19:08 · 286 阅读 · 0 评论 -
Jetpack组件之Lifecycle的使用与解析
一.使用方式Lifecycle可以感知Activity和Fragment的生命周期,使用方法如下。首先新建一个类实现LifecycleObserver接口,该接口不提供任何方法,而是依靠OnLifecycleEvent注解实现生命周期感知。public class CustomLifeCycle implements LifecycleObserver { private String TAG; public CustomLifeCycle(String tag) {原创 2020-07-29 23:02:09 · 519 阅读 · 0 评论 -
App启动时的白屏优化
1.app启动方式app启动分为冷启动和暖启动:冷启动:当app安装后第一次启动或app被完全终止后再启动,此时,程序系统需要为app创建进程。暖启动:app仍然在内存中,只是从后台运行转为前台运行,此时app进程已经被创建。app冷启动到显示第一个Activity,需要进行进程创建、资源加载等操作,会耗费一定时间,为了不让用户感觉到延迟,系统在app打开时,会展示一个空白页面,使用户...原创 2020-01-02 23:18:15 · 1253 阅读 · 0 评论 -
OkHttp源码分析--执行流程
1.创建OkHttpClientOkHttpClient okHttpClient = new OkHttpClient.Builder().build();OkHttp的创建采用了构建者模式,OkHttpClient.Builder()无参构造方法为 OkHttpClient的属性提供了默认值。public Builder() { dispatcher = new Dispa...原创 2019-12-15 14:16:51 · 179 阅读 · 0 评论 -
Android9.0下Hook式插件化改动
1.IActivityManager1启动Activity执行到Instrumentation的execStartActivity方法时,Android 26以下版本的代码为:public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Int...原创 2019-12-08 19:04:02 · 1341 阅读 · 1 评论 -
Activity的LoadedAPK式插件化
一.原理ActivityThread类中有一个内部类H继承自Handler,当启动Activity时,H会发送LAUNCH_ACTIVITY消息,从而执行到H的handleMessage方法,LAUNCH_ACTIVITY事件的处理如下:case LAUNCH_ACTIVITY: { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ...原创 2019-12-08 18:07:00 · 534 阅读 · 0 评论 -
Activity的Hook式插件化
一.Activity启动过程当在应用程序中调用startActivity方法进行Activity跳转时,最终会调用startActivityForResult方法:public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle ...原创 2019-11-30 11:59:00 · 247 阅读 · 0 评论 -
占位式插件化框架
一.原理在插件化中,宿主是安装在手机中的正在运行的APP,插件是没有经过安装的APK文件。插件化可以实现宿主APP直接加载插件APK,使插件APK不用安装就可以运行在宿主APP中。由于插件APK没有安装,它是没有上下文(Context)环境的,想要运行插件APK,需要把宿主的Context传递给插件APK。在占位式插件化中,当需要启动插件的Activity时,实际是创建了宿主APP中的代理Ac...原创 2019-11-24 10:58:00 · 393 阅读 · 0 评论 -
Android动态换肤实现
一.原理动态换肤是将多种资源文件放在皮肤包中,皮肤包本质上就是打包成的APK文件,与静态换肤相比,动态换肤将皮肤资源分离出来单独打包,可以有效减少APP的大小。下图是APK文件的内部组成:其中classes.dex文件中的内容对应的是Java代码,在皮肤包中这部分内容是不需要的。resources.arsc文件中的内容是资源文件,如下图所示:每一个资源文件都有一个ID,如“0x7f040...原创 2019-11-24 10:47:11 · 1350 阅读 · 0 评论 -
Android静态换肤实现
静态换肤是在APP应用内部放置多套资源,进行资源的切换,静态换肤一般用在APP的日夜间模式切换中。一.原理当在Activity中使用setContentView加载布局时,会调用到AppCompatDelegateImpl的setContentView方法,该方法代码如下: @Override public void setContentView(int resId) { ...原创 2019-11-24 10:43:59 · 1632 阅读 · 0 评论 -
RxJava的基本使用和操作符
一.基本使用1.链式调用首先在build.gradle中添加依赖:implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'implementation 'io.reactivex.rxjava2:rxjava:2.0.7'RxJava的使用步骤包括:创建被观察者进行事件发送创建观察者进行事件响应通过订阅方法连接观察者和被观察者...原创 2019-11-10 22:47:13 · 224 阅读 · 0 评论 -
EventBus使用与源码分析
一.EventBus的使用1.基于反射1)非粘性事件首先在build.gradle中加入EventBus的依赖:implementation 'org.greenrobot:eventbus:3.1.1' 定义消息事件实体类:public class MessageEvent { private String name; private int age; p...原创 2019-11-03 11:47:34 · 261 阅读 · 0 评论 -
Handler原理
在Android中,耗时任务一般放在子线程中处理,而UI的更新则在主线程中进行,通常在子线程和主线程之间的切换使用Handler完成。Handler的消息机制主要包括Handler、MessageQueue、Message、Looper,四者的关系如下图所示。MessageQueue是一个消息队列,内部使用单向链表维护消息列表,主要有两个方法:enqueueMessage用于往消息队列中插入一...原创 2019-10-18 21:58:18 · 155 阅读 · 0 评论 -
DataBinding使用与分析
一.使用方式1.单向绑定一1)首先在module的gradle中加入以下内容:dataBinding{ enabled = true}2)新建一个实体类User,里面有两个成员变量:public class User { public ObservableField<String> name = new ObservableField<>(...原创 2019-09-22 23:56:26 · 526 阅读 · 0 评论