IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android组件化页面跳转策略 -> 正文阅读

[移动开发]android组件化页面跳转策略

当我们进行一个页面跳转的时候,有哪些方法呢?
大家应该十分清楚,android原生提供了两种方案:隐式跳转和显式跳转
这两种方案想必大家都非常清楚,这里就不一一举例了。而在组件化开发过程中,我们绝大多数都无法使用显式跳转来跳转页面。原因很简单,因为我们要跳转的页面可能不是在同一个library中,因此无法import对应activity的路径。因此,我们只能使用隐式跳转来完成需求。我们先不考虑使用类似arouter这样的路由框架(底层原理也是使用隐式跳转的)。
倘若,我们不想引入第三方框架,那么该如何实现对应的需求呢?

这里提供了两种方案

  • 通过类加载器的形式进行组件间跳转
  • 通过全局map来跳转

我们先看下项目的结构
在这里插入图片描述
我们来看下如何在不使用路由框架的情况下从Test1Activity跳转到TestActivity。

通过类加载器的形式进行组件间跳转

package com.brett.test1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Test1Activity extends AppCompatActivity {
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);
        btn = findViewById(R.id.button);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    Class clazz = Class.forName("com.brett.test.TestActivity");
                    Intent intent = new Intent(Test1Activity.this,clazz);
                    startActivity(intent);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
    }
}

这种方法比较简单,我们拿到类的路径名,然后使用隐式跳转进行页面跳转即可。缺点是:类路径名不要写错,写错就GG了。

通过全局map来跳转

思路大概是这样:我们新建一个RecordPathManager类里面持有一个map来存储需要跳转的页面的类,然后在app模块的application方法把需要跳转的类添加进去,最后当我们要跳转页面时循环遍历该map找到对应的页面。

package com.brett.common.bean;

/**
 * Created by Brett.li on 2022/6/22.
 */
public class PathBean {
    private String path;
    private Class clazz;

    public PathBean(){}

    public PathBean(String path, Class clazz) {
        this.path = path;
        this.clazz = clazz;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public Class getClazz() {
        return clazz;
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }
}

package com.brett.common;

import com.brett.common.bean.PathBean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Brett.li on 2022/6/22.
 */
public class RecordPathManager {
    private static Map<String, List<PathBean>> maps = new HashMap<>();

    public static void addGroupInfo(String groupName,String pathName,Class<?> clazz){
        List<PathBean> list = maps.get(groupName);
        if(null==list){
            list = new ArrayList<>();
            list.add(new PathBean(pathName,clazz));
            maps.put(groupName,list);
        }else{
            maps.put(groupName,list);
        }
    }

    public static Class<?> startTargetActivity(String groupName, String pathName){
        List<PathBean>list = maps.get(groupName);
        if(list == null){
            return null;
        }
        for (PathBean pathBean:list){
            if(pathName.equalsIgnoreCase(pathBean.getPath())){
                return pathBean.getClazz();
            }
        }
        return null;
    }
}
package com.brett.myapplication;

import android.app.Application;

import com.brett.common.RecordPathManager;
import com.brett.test.TestActivity;
import com.brett.test1.Test1Activity;

/**
 * Created by Brett.li on 2022/6/22.
 */
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        RecordPathManager.addGroupInfo("test","test_TestActivity", TestActivity.class);
        RecordPathManager.addGroupInfo("test1","test1_Test1Activity", Test1Activity.class);
    }
}

package com.brett.test1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.brett.common.RecordPathManager;

public class Test1Activity extends AppCompatActivity {
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);
        btn = findViewById(R.id.button);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Class<?> targetActivity = RecordPathManager.startTargetActivity("test","test_TestActivity");
                startActivity(new Intent(Test1Activity.this,targetActivity));
            }
        });
    }
}

这种方法的缺点是必须在application中添加类才行,不然就跳转不了了。

注意:最好新建一个模块单独封装RecordPathManager的逻辑,把该模块当作一个common模块,所有的模块都继承该模块,这样就很通用了。
像笔者这样:所有的模块都依赖common模块。
在这里插入图片描述

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 10:57:45  更:2022-07-03 10:59:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 2:34:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码