日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2025/3/15 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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如何设计并且实现一个注入框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。