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字節碼插件
總結
以上是生活随笔為你收集整理的android自动登录实现框架,Android如何设计并且实现一个注入框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [云炬创业管理笔记]第四章把握创业机会测
- 下一篇: android sina oauth2.