通过配置实现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();
}
}
网友评论