自动化编辑器作为手机平台的低代码rpa工具提供了丰富的条件和动作来编辑自动化任务基本上可以做到不用写代码就可以完成一个功能完善的自动化任务,不过遇到一些特殊的需求自动化编辑器内置的动作可能不能实现我们想要的功能,这时候就需要自定义动作即开发插件
下面的演示的demo已经重新封装 可以在github和gitee上下载
开发自动化编辑器的插件还是比较简单的
首先新建一个Android 项目
这里要注意Package Name 一定要用cn.autoeditor.pluginaction开头,这个是自动化编辑器搜索插件的硬性要求
然后 Launcher Activity 实现如下接口 就可以了
public interface IPluginAction {
//返回插件支持的动作列表
public List<String> actionList() ;
//返回指定动作需要的参数列表
public List<String> actionArgs(String actionName) ;
//指定动作参数对应的可选列表,如果可选列表为空将对应变量列表作为输入参数
public Map<String, List<String>> argsOptions(String actionName) ;
//返回指定动作的返回结果列表
public List<String> results(String actionName) ;
//初始化android context
public void initContext(String actionName, Context context) ;
/**执行具体动作
* @param actionName 执行动作名称
* @param args 输入参数
* @param bitmap 当前循环截图
* @return 返回执行结果
* */
public Map<String, String> onAction(String actionName, Map<String, String> args, Bitmap bitmap) ;
}
下面详细介绍一下上面的方法
public List<String> actionList() ;
返回此插件支持的动作列表,我们这里可以返回三个测试动作
@Override
public List<String> actionList() {
return new ArrayList<String>(){
{
add("测试动作1");
add("测试动作2");
add("测试动作3");
}
};
}
代码效果
public List<String> actionArgs(String actionName)
返回指定动作需要的参数列表,actionName 会将上面actionList返回的三个动作名称依次传入
private List<String> test1ActionArgs(){
return new ArrayList<String>(){
{
add("动作1参数1") ;
add("动作1参数2") ;
}
} ;
}
private List<String> test2ActionArgs(){
return new ArrayList<String>(){
{
add("动作2参数1") ;
}
} ;
}
//不需要参数可以返回null
private List<String> test3ActionArgs(){
return null ;
}
@Override
public List<String> actionArgs(String actionName) {
switch (actionName){
case "测试动作1":
return test1ActionArgs() ;
case "测试动作2" :
return test2ActionArgs() ;
case "测试动作3":
return test3ActionArgs() ;
default:
break;
}
return null ;
}
代码效果
public List<String> results(String actionName) 返回指定动作需要返回的结果,返回的结果可以通过自动化编辑器保存在指定的变量中
private List<String> test1ActionResults(){
return new ArrayList<String>(){
{
add("动作1返回结果") ;
}
} ;
}
private List<String> test2ActionResults(){
//返回null代表此动作无返回结果
return null ;
}
private List<String> test3ActionResults(){
return new ArrayList<String>(){
{
add("动作3返回结果1") ;
add("动作3返回结果2") ;
}
} ;
}
@Override
public List<String> results(String actionName) {
switch (actionName){
case "测试动作1":
return test1ActionResults() ;
case "测试动作2" :
return test2ActionResults() ;
case "测试动作3":
return test3ActionResults() ;
default:
break;
}
return null ;
}
此代码效果参照上方参数效果图
public Map<String, List<String>> argsOptions(String actionName)
返回指定动作需要指定自定义输入内容的参数列表及其对应的自定义内容,此列表不包含的参数会选择变量作为输入内容,此列表包含的参数只能选择对应的列表的内容
public List<String> test1ActionsArg1Options(){
return new ArrayList<String>(){
{
add("动作1参数1只能选择这些内容--1") ;
add("动作1参数1只能选择这些内容--2") ;
add("动作1参数1只能选择这些内容--3") ;
}
};
}
private Map<String, List<String>> test1ActionArgsOptions(){
Map<String,List<String>> options= new HashMap<>() ;
options.put("动作1参数1",test1ActionsArg1Options()) ; //此map只包含"动作1参数1",其它参数的输入内容选择变量,此参数选择列表对应的内容
return options ;
}
@Override
public Map<String, List<String>> argsOptions(String actionName) {
switch (actionName){
case "测试动作1":
return test1ActionArgsOptions() ;
default:
break ;
}
//返回null代表所有参数都通过变量作为输入
return null;
}
代码效果,只展示参数1,其它全部需要选择变量 public void initContext(String actionName, Context context) ; 初始化Android Context,这里注意因为是插件,不能使用我们自己Activity的Context,而且在自动化编辑器加载插件时 Activity的onCreate和其它生命周期是不会被调用的,所以如果想使用Context只能使用这里传进来的Context,这个方法是通过ui线程调用的,这里我们保存Context,并且创建一个Handler,注意这里会多次调用(包含的动作列表数量),这里我只创建一个Handler,通过Handler显示一个Toast
private Handler handler ;
@Override
public void initContext(String actionName, Context context) {
if(handler == null){
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
Toast.makeText(context, msg.obj.toString(),Toast.LENGTH_SHORT).show();
return false;
}
}) ;
}
}
public Map<String, String> onAction(String actionName, Map<String, String> args, Bitmap bitmap) ;
关键方法来了,这个就是实际运行中执行动作是调用的方法,这里演示只通过toast显示一下
private Map<String,String> test1ActionReturn(){
Map<String,String> result = new HashMap<>() ;
result.put("动作1返回结果", "123") ; //这里测试返回固定值
return result ;
}
private Map<String,String> test2ActionReturn(){
return null ;//因为测试动作2不需要返回结果这里直接返回null
}
int test3Result1 =1;
int test3Result2 = 99 ;
private Map<String,String> test3ActionReturn(){
Map<String,String> result = new HashMap<>() ;
result.put("动作3返回结果1", String.valueOf(test3Result1++)) ;
result.put("动作3返回结果2", String.valueOf(test3Result2--)) ;
return result ;
}
@Override
public Map<String, String> onAction(String actionName, Map<String, String> args, Bitmap bitmap) {
Message message = new Message();
String toastMsg = actionName ;
if(args != null){
toastMsg += args.toString();
}
message.obj = toastMsg ;
handler.sendMessage(message) ;
switch (actionName){
case "测试动作1":
return test1ActionReturn() ;
case "测试动作2" :
return test2ActionReturn() ;
case "测试动作3":
return test3ActionReturn() ;
default:
break;
}
return null;
}
测试动作1运行效果及回放
测试动作3运行效果及回放