美文网首页
通过配置实现Activity动态执行顺序的一种方式

通过配置实现Activity动态执行顺序的一种方式

作者: 夜风冷_9495 | 来源:发表于2019-02-14 17:02 被阅读0次

    通过配置实现Activity动态执行顺序的一种方式

    ​ 最近做一个小工具,是对整机进行测试,原来测试程序是一个功能模块一个activity,测试完会自动跳转下一个模块activity, 由于后续在此机器上会有一些衍生机型,衍生机型基本上是增减一些模块, 所以测试希望能动态的配置,比如原机型有10个模块, 衍生机型只有4个模块, 那我们抽出4个模块测试,测试顺序和跳转都可根据配置进行。

    假设有4个模块页面:

    AActivity,
    BActivity,
    CActivity,
    DActivity
    

    那么会有以下几个问题:

    1.设计配置文件
    2.跳转顺序根据配置执行

    之前的跳转都是在Activity里面固定写好下一步的跳转, 比如在AActivity完成后要跳转Bactivity

    Intent intent = new Intent(this,BActivity.class);
    startActivity(intent);
    

    很显然我们现在不能这么做,不能在activity固定写下一步跳转去哪里,下一步的跳转必须通过配置来完成。

    一.通过配置action 隐式启动

    这时候了解到启动activity可以通过action的方式隐式启动。需要在manifest中配置每个Activity不同的action,在代码中通过action来启动即可。

    先在manifest中设置action:
    <activity android:name=".activity.AActivity">
        <intent-filter>
            <action android:name="a" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".activity.BActivity">
        <intent-filter>
            <action android:name="b" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".activity.CActivity">
        <intent-filter>
            <action android:name="c" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".activity.DActivity">
        <intent-filter>
            <action android:name="d" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    

    为了方便调试,配置文件暂定为本地json文件,执行顺序为A-B-C-D:

    [
      {
        "name": "A模块",
        "activityName": "AActivity",
        "action": "a"
      },
      {
        "name": "B模块",
        "activityName": "BActivity",
        "action": "b"
      },
      {
        "name": "C模块",
        "activityName": "CActivity",
        "action": "c"
      },
      {
        "name": "D模块",
        "activityName": "DActivity",
        "action": "d"
      }
    ]
    

    定义一个ActModel

    public class ActModel implements Serializable {
        private String name;
        private String activityName;
        private String action;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getActivityName() {
            return activityName;
        }
    
        public void setActivityName(String activityName) {
            this.activityName = activityName;
        }
    
        public String getAction() {
            return action;
        }
    
        public void setAction(String action) {
            this.action = action;
        }
    }
    
    

    读取配置config.json

           List<ActModel> actModelList =new Gson().fromJson(TUtil.getJson("config.json", this), new TypeToken<List<ActModel>>(){}.getType());
    
    获取当前运行activity名称
       public static String getRunningActivityName(Context context) {
            String contextString = context.toString();
            return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));
        }
    
    动态跳转:

    根据当前运行的activity名称匹配到actModelList中的位置和下一步要跳转的模块,跳转下一步:

    public static void autoNext(Activity activity){
            String actName = getRunningActivityName(context);
            int position = 0;
            ActModel actModel = null;
            for(int i=0;i<actModelList.size();i++){
                ActModel tmp_ActModel = actModelList.get(i);
                if(tmp_ActModel.getActivityName().equals(actName)){
                    position = i;
                    actModel = tmp_ActModel;
                    break;
                }
            }
            if(actModel == null){
                return;
            }
            if(position<actModelList.size()-1) {
                ActModel nextActModel = actModelList.get(position + 1);
                Intent intent = new Intent();
                intent.setAction(nextActModel.getAction());
                context.startActivity(intent);
                context.finish();
            }
        }
    

    如果需要调整顺序, 只需要在配置中 修改下item的顺序即可。

    二.通过配置路由方式

    引入ARouter包

    implementation 'com.alibaba:arouter-api:1.4.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
    

    修改配置文件格式,不需要修改Manifest为每个activity增加action, 通过配置path去实现

    [
      {
        "name": "A模块",
        "activityName": "AActivity",
        "path": "/module_a/AActivity"
      },
      {
        "name": "B模块",
        "activityName": "BActivity",
         "path": "/module_a/BActivity"
      },
      {
        "name": "C模块",
        "activityName": "CActivity",
        "path": "/module_a/CActivity"
      },
      {
        "name": "D模块",
        "activityName": "DActivity",
        "path": "/module_a/DActivity"
      }
    ]
    

    同时在Activity上增加注解,ARouter使用方式请自行百度

    例如:

    @Route(path = "/module_a/AActivity")
    public class AActivity extends BaseActivity {
        ...   
    }
    

    修改自动跳转方法

    public static void autoNext(Activity activity){
        String actName = getRunningActivityName(context);
        int position = 0;
        ActModel actModel = null;
        for(int i=0;i<actModelList.size();i++){
            ActModel tmp_ActModel = actModelList.get(i);
            if(tmp_ActModel.getActivityName().equals(actName)){
                position = i;
                actModel = tmp_ActModel;
                break;
            }
        }
        if(actModel == null){
            return;
        }
        if(position<actModelList.size()-1) {
            ActModel nextActModel = actModelList.get(position + 1);
            ARouter.getInstance().build(nextActModel.getPath()).navigation();
            context.finish();
        }
    }
    

    相关文章

      网友评论

          本文标题:通过配置实现Activity动态执行顺序的一种方式

          本文链接:https://www.haomeiwen.com/subject/zjtyeqtx.html