android自动登录实现框架,Android如何设计并且实现一个注入框架

1.小强先定了一个小小的目标,让下面的代码可以直接Run起来

public class MainActivity extends InjectorActivity {

InjectedObject injectedObject;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 直接调用而不会报空指针异常

injectedObject.fun();

}

}

1.1 首先定义个抽象接口

// 成员变量实例注入接口

public interface IMemberInjector {

/**

* 给某一个类注入一个实例属性

* @param instance 该属性的实例

*/

void injectorMembers(T instance);

}

// 构造实例的工厂接口

public interface IFactory {

T newInstance();

}

1.2 类注入一个属性实例

public class MainActivityMemberInjector implements IMemberInjector {

@Override

public void injectorMembers(MainActivity instance) {

setInjectorObject(instance);

// 其它属性实例注入

}

// 注入injectedObject的实例

private void setInjectorObject(MainActivity instance) {

instance.injectedObject = new IFactory() {

@Override

public InjectedObject newInstance() {

return new InjectedObject();

}

}.newInstance();

}

}

1.3 统一初始化

public class InjectorActivity extends Activity {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

InjectorManager.inject(this.getClass().getName());

}

@Override

protected void onDestroy() {

super.onDestroy();

InjectorManager.remove(this.getClass().getName());

}

}

// 完成MemberInjector的注册关系

public class InjectorManager {

private static Map map = new HashMap<>();

static {

map.put(MainActivity.class.getName(), new MainActivityMemberInjector());

}

public static void inject(String target) {

if (map.containsKey(target)) {

IMemberInjector injector = map.get(target);

injector.injectorMembers(target);

} else {

// need register

}

}

public static void remove(String target) {

map.remove(target);

}

}

小小的目标瞬间完成Run一把,可以直接调用fun函数运行. 这就是注入的魅力所在有木有把解耦体现的淋漓尽致!!!

在小小的目标完成之后,心里美滋滋的!

可是好景不长,过了几天

除了Activity,其它模块也要注入对象而且注入的对象个数还不止一个

小强心里想,这躲过了被打死,却逃不出要被累死的节奏,怎么办 求生欲满满的......

2. 小强的下一个目标,既要躲过被打死,也要躲过被累死

小强走上了自动化之路(幸福来的太突然了)

2.1 抽取基础功能库

// 包含接口的设计,InjectorActivity, InjectorManager

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Injector {

}

2.2 编译期间生成重复代码

Annotation Processor(注解处理器)

自定义Gradle插件

// 通过编译期间生成繁重而又重复木有技术含量的工作

public class MainActivityComponent implements IComponent {

@Override

public void inject(MainActivity instance) {

// 该字段通过编译期间扫描可以得知并且生成相应的实例注入代码

instance.injectedObject = new IFactory() {

@Override

public InjectedObject newInstance() {

return new InjectedObject();

}

}.newInstance();

}

}

2.3 配置一下直接Run

// 该注解用来描述该字段需要注入实例

public class MainActivity extends InjectorActivity {

@Injector

InjectedObject injectedObject;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 操作 injectedObject

}

}

此后小强过上了既躲过被打死,又躲过了被累死的生活!!!

3. Android Dagger2实践

大家都比较熟悉了

4. 字节码后记

类别

优缺点

适用

JavaPoet

简单易用

大量的类代码

Javassist

简单易用

大量的类代码(可操作字节码)

ASM

学习成本高

简单的函数调用(APM统计)

用ASM写的一个Gradle插件

ASM字节码插件

本项目是一个基于安卓的框架项目源码 Loonandroid一个注解框架,不涉及任何UI效果,目的是一个功能一个方法,以方法为最小颗粒度对功能进行拆解。把功能傻瓜化,简单化,去掉重复性的代码,隐藏复杂的实现。以便团队合作或者后期修改变得简单。说框架是夸大了,主要是因为我比较喜欢偷懒,对于一个码农来说,能够偷懒,并且在不影响项目质量的情况下,是不容易的。 很多朋友看到注解就就要吐槽,会影响性能什么的。注解,确实会影响性能。通过注解自动注入,反射会让程序变慢50~100毫秒左右,从体验感基本感觉不出来.硬件性能好的手机可以忽略,经过测试无需太大的担心。我是做外包的,初衷是在不影响项目质量的前提下减少我的工作量,而且BUG其他人改起来相对比较容易,本工具专属外包码农,如果你想做精细,很在意性能数据,请看看就好。 1、基本功能 InLayer注解 InPlayer 注解 Activity生命周期注解 InView注解 InSource注解 InAll注解 后台进程注解 方法点击事件注解 基类注解 自动Fragment注解 手动Fragment注解 2、适配器功能 无适配器 无参baseAdapter 自定义一adapter 自定义二adapter 自动绑定一adapter 自动绑定二adapter 通用适配器 3、综合功能集合 网络请求模块 输入验证 跨进程通讯 Json格式化类 倒计时类 4、傻瓜式下拉刷新 Listview Grid 横向Scrollview 纵向Scrollview 横向ViewPage 纵向ViewPage WebView 5、自定义模块类 自定义模块XML中使用 自定义模块变量使用 6、傻瓜式组件类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值