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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android—简单路由框架实践

發布時間:2023/12/18 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android—简单路由框架实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡單路由框架實現:

1.目錄結構

????????

?????????

?annotation和factory-compiler是兩個java?library,分別負責接口還有APT。

2.依賴關系

app作為主工程依賴所有

implementation project(':annotation') implementation project(':router') implementation project(':secondmodule') annotationProcessor project(':factory-compiler')

secondmodule作為組件

implementation project(':annotation') implementation project(path: ':router') annotationProcessor project(':factory-compiler')

factory-compiler

implementation 'com.google.auto.service:auto-service:1.0-rc6' implementation project(':annotation') implementation 'com.squareup:javapoet:1.10.0' annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'

3.在annotation中創建注解類

@Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS) public @interface Router {String value(); }

4.使用注解

在app的MainActivity類類名打上注解

@Router(value = "MainActivity")

在secondmodule的SecondActivity類類名打上注解

@Router(value = "SecondActivity")

5.在router工程創建路由類

public class TextRouter {// 頁面路由表private static final List<Path> paths = new ArrayList<>();// 將頁面插入到路由表中public static void add(String path, Class<? extends Activity> activity) {paths.add(new Path(path, activity));}/*** 通過 router 打開 activity** @param context* @param path*/public static void navigate(Context context, String path, Bundle bundle) {// 遍歷路由表,進行 uri 的匹配,匹配成功,則啟動對面的 Activity 頁面for (Path p : paths) {if (p.value.equals(path)) {Intent intent = new Intent(context, p.getActivity());intent.putExtra(path,bundle);context.startActivity(intent);return;}}}// 路由記錄public static class Path {private final String value;private final Class<? extends Activity> activity;public Path(String path, Class<? extends Activity> activity) {this.value = path;this.activity = activity;}public Class<? extends Activity> getActivity() {return activity;}} }

我們只有通過該類的add方法添加進value值跟對應的Activity即可完成注冊,當我們需要跳轉到某個類時,就用navigate方法傳入對應的value值就可以完成跳轉。

接下來就可以用APT來實現對用上注解的Activity(既MainActivity跟SecondActivity)進行add操作。

6.在factory-compiler中創建Processer

@AutoService(Processor.class) public class RouterProcessor extends AbstractProcessor {@Overridepublic boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {String pkgName = null;// 首先獲取注解元素Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(Router.class);if (elements.isEmpty()) return false;// 定義一個 public static 類型的 map 方法MethodSpec.Builder mapMethod = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.FINAL, Modifier.STATIC);// 遍歷注解元素for (Element element: elements) {if (element.getKind() == ElementKind.CLASS) {pkgName = String.valueOf(processingEnv.getElementUtils().getPackageOf(element).getQualifiedName());Router router = element.getAnnotation(Router.class);// 獲取 activity 的 class nameClassName className = ClassName.get((TypeElement) element);// 獲取 uri 地址String path = router.value();// 生成代碼 Routers.map(uri, xxx.class);ClassName router1 = ClassName.get("com.example.router", " TextRouter");mapMethod.addStatement("$T.add($S, $T.class)",router1, path, className);}}mapMethod.addCode("\n");// 生成 RouterMapping 文件TypeSpec helloWorldClass = TypeSpec.classBuilder("RouterMapping").addModifiers(Modifier.PUBLIC, Modifier.FINAL).addMethod(mapMethod.build()).build();assert pkgName != null;JavaFile javaFile = JavaFile.builder(pkgName, helloWorldClass).build();try {javaFile.writeTo(processingEnv.getFiler());} catch (IOException e) {e.printStackTrace();}return true;}@Overridepublic Set<String> getSupportedAnnotationTypes() {Set<String> annotations = new LinkedHashSet<>();annotations.add(Router.class.getCanonicalName());return annotations;}@Overridepublic SourceVersion getSupportedSourceVersion() {return SourceVersion.latestSupported();} }

Rebuild之后我們就可以看到編譯生成的.java文件

?App工程下面也會生成

?不過我們還需要調用RouterMapping.init()方法才能讓這兩個activity注冊成功。可以選擇在app的Application中完成初始化操作

public class TextApp extends Application {@Overridepublic void onCreate() {super.onCreate();init();SecondModule.init();}private void init(){RouterMapping.init();} }

secondmodule中的初始化?

public class SecondModule {public static void init(){RouterMapping.init();} }

8.實現路由跳轉

@Router(value = "MainActivity") public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.tv);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {TextRouter.navigate(MainActivity.this,"SecondActivity", null);}});}@Overrideprotected void onResume() {super.onResume();} }

SecondActivity也是同樣的操作即可跳轉到MainActivity。

因為這里只示范了兩個module的跳轉,app作為主工程需要對其他子module進行初始化操作所以依賴了所有子工程,不過可以發現MainActivity在沒有import入SecondModule的情況下也可以實現跳轉,因此路由可以解決不相互依賴的組件之間相互跳轉問題,只要在需要被跳轉的類上進行注解。

總結

以上是生活随笔為你收集整理的Android—简单路由框架实践的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 女的被男的操 | 欧美成人h | 日日骑| h文在线观看 | 免费观看国产精品 | 中国av一级片 | 激情拍拍拍 | 女av在线| 日韩精品一二三四 | 美日韩丰满少妇在线观看 | 成熟妇人a片免费看网站 | 96超碰在线 | 精品人妻一区二区三区四区在线 | 免费人成又黄又爽又色 | 舐丝袜脚视频丨vk | 无人在线观看高清视频 单曲 | 深爱激情av | 国产良妇出轨视频在线观看 | 第四色激情 | 精品一区久久久 | 国产亚洲色婷婷久久 | 一区二区三区免费在线观看视频 | 日韩激情视频在线 | 国产亚洲精品成人无码精品网站 | 青草视频在线免费观看 | www.com日本 | 超碰极品| 紧身裙女教师三上悠亚红杏 | 日韩一级片中文字幕 | 伊人快播 | 成人一区二区三区视频 | 91影院在线播放 | 中国一级片在线观看 | 动漫美女视频 | 一级坐爱片 | 中文字幕av亚洲精品一部二部 | 国产黄色精品视频 | 在线免费观看a视频 | 国产精品美女久久久久图片 | 欧美黑粗硬 | 狠狠天堂| 麻豆成人在线 | 欧美淫视频 | 三年大片在线观看 | 久久国产精品首页 | 91麻豆蜜桃一区二区三区 | 久久久久久亚洲中文字幕无码 | 国产亚洲精品精品精品 | 伊人9999 | 天天干天天拍 | 亚洲色图在线播放 | 国产日韩在线看 | 日本黄色一区二区三区 | 日韩美女视频一区 | 无码人妻一区二区三区av | 最近中文字幕免费mv视频7 | 中文字幕第20页 | 久伊人网 | 国产性猛交普通话对白 | 亚洲最大福利视频 | 中文文字幕一区二区三三 | 午夜精品久久久久久久久久久久 | 香蕉911| 国产黄在线观看 | 日韩18p| 欧美高清视频 | 91视频99 | 香蕉久久网 | 99re国产在线 | 国产成人精品无码免费看夜聊软件 | 91成人在线观看高潮 | 97超碰福利| 精品影片一区二区入口 | 亚洲精品成人a | 亚洲国产黄色 | 亚洲精品免费在线视频 | 欧美色xxxxx 日本精品一区二区三区四区的功能 | 天天天干 | 好姑娘在线观看高清完整版电影 | 欧美高清性 | 国产伦精品一区二区三区网站 | 岳乳丰满一区二区三区 | gav成人 | 国产毛片3| 天天透天天干 | 欧美精品自拍 | 另类视频在线观看+1080p | 国产精品高潮呻吟久久av黑人 | 中文字幕一区二区三区四区五区 | 樱桃国产成人精品视频 | 青青草社区视频 | 精品无码一区二区三区电影桃花 | 精品久久久久久国产 | 激情久久av| 视频区小说区 | 日本亲与子乱xxx | 亚洲爆乳无码精品aaa片蜜桃 | 超碰天天 | 精品视频久久久久久久 |