/ExecutionStringCode

android运行执行字符串代码--实现接口可配置跳转任何Activity

Primary LanguageJava

ExecutionStringCode

android执行字符串代码--实现接口可配置跳转任何Activity

所需jar包: compile 'org.apache.commons:commons-jexl3:3.1'

好了,上代码(完整代码也可以参见RunString.java):

/**
 * 执行字符串代码方法
 * @param jexlExp
 * @param map
 * @return
 */
public static Object convertToCode(String jexlExp,Map<String,Object> map){ 
    JexlExpression e = jexlEngine.createExpression(jexlExp);
    JexlContext jc = new MapContext();
    for(String key:map.keySet()){
        jc.set(key, map.get(key));
    }
    return e.evaluate(jc);
    
}

拼装字符串代码,实现接口定义打开任意Activity

/**
 * 跳转的Activity 可配置
 * @param cls            activity
 * @param packageContext context
 * @param itemId         传参
 */
public static void testExecuteExpression(Context packageContext, Class<?> cls , String itemId) {
    Intent intent = new Intent();
    //组装代码 , 当然了,字符串里面 比如 intent 、 packageContext 是需要放在map里的
    Map<String,Object> map2=new HashMap<String,Object>();
    map2.put("packageContext",packageContext);
    map2.put("itemId",itemId);
    map2.put("intent",intent);
    map2.put("class",cls);
    String expression2="intent.setClass(packageContext, class)#intent.putExtra('item_id', itemId)#packageContext.startActivity(intent)";
    String [] ss = expression2.split("#");
    for (int i = 0; i < ss.length; i++) {
        convertToCode(ss[i] , map2);
    }
}

/**
 * 执行 'com.test.ldr.ldr_test.ItemDetailActivity' 这种指定页面的是String类型的
 * @param packageContext context
 * @param itemId         传参
 */
public static void executeStringClassName(Context packageContext , String itemId) {
    Intent intent = new Intent();
    //组装代码 , 当然了,字符串里面 比如 intent 、 packageContext 是需要放在map里的
    Map<String,Object> map2=new HashMap<String,Object>();
    map2.put("packageContext",packageContext);
    map2.put("itemId",itemId);
    map2.put("intent",intent);
    String expression2= "intent.setClassName(packageContext, 'com.test.ldr.ldr_test.ItemDetailActivity')#intent.putExtra('item_id', itemId)#packageContext.startActivity(intent)";
    String [] ss = expression2.split("#");
    for (int i = 0; i < ss.length; i++) {
        convertToCode(ss[i] , map2);
    }
}



嗯,就这样。还有其他更多用途,这里只是给了其中一种。 伙伴们可以结合实际需求,挖掘挖掘