imag

271 阅读2分钟

ScriptableObject-->AbstractImagObject-->page ScriptableObject-->AbstractImagObject-->imag-->JsImag

imag

PageActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    setCreateAnimation();  //执行入场动画
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setHomeWatcher();  //home键监听
    setShakeListener(); //摇一摇监听
    setKeyboardWatcher(); //键盘事件监听
    initHideKeyboardUtil(); //隐藏键盘监听
    initDoubleTapExit();  //两次返回退出

    application = (MainApplication) getApplication();
    String url = getIntent().getStringExtra("url");
    String xml = getIntent().getStringExtra("xml");
    if (savedInstanceState != null) {
        url = savedInstanceState.getString("url");
        xml = savedInstanceState.getString("xml");
    }

    org.mozilla.javascript.Context jsContext = org.mozilla.javascript.Context.enter();  //初始化jsContext
    jsContext.setOptimizationLevel(-1);
    this.page = createImagPage(jsContext, url, xml); //将activity,url,xml传给page,并解析xml
    Tab tab = page.getTab();
    if (tab == null) {
        loadRootFragment(R.id.main_content, new PageFragment(page));
    } else {
        loadRootFragment(R.id.main_content, tab.getTabsFragment());
    }

    SlidingMenu slidingMenu = page.getSlidingMenu();
    if (slidingMenu != null) {
        slidingMenu.getSlidingMenu().attachToActivity(this, com.imagjs.main.lib.slidingmenu.SlidingMenu.SLIDING_CONTENT);
        if (slidingMenu.getLeftItem() != null) {
            slidingMenu.getSlidingMenu().setMenu(R.layout.menu_frame);
            loadRootFragment(R.id.menu_frame, new SlidingMenuFragment(page, false));
        }
        if (slidingMenu.getRightItem() != null) {
            slidingMenu.getSlidingMenu().setSecondaryMenu(R.layout.menu_frame_two);
            loadRootFragment(R.id.menu_frame_two, new SlidingMenuFragment(page, true));
        }
    }
    initDevFloatView();  //初始化开发设置
}

回调执行:

android imag
onResume onactive
onAttachedToWindow onbeforeload
onWindowFocusChanged onload
onStop oninactive
onBackPressedSupport onback
onDestroy onunload
  1. 进入 entry: onStart---->onResume---->onAttachedToWindow------->onWindowVisibilityChanged--visibility=0---------->onWindowFocusChanged(true)------->

  2. 退出应用 exit: onPause---->onStop---->onWindowFocusChanged(false) ---------------------- (lockscreen)

  3. 返回上一个界面 exit : onPause----->onWindowFocusChanged(false)-------->onWindowVisibilityChanged--visibility=8------------>onStop(to another activity)

监听onActivityResult:

page

Page page = ScriptUtils.createImagPage(jsContext, this);
page.setUrl(url);
page.setXml(xml);
page.parse(url, xml);

获取activity,jsContext
public Imag(org.mozilla.javascript.Context jsContext, Activity activity) {
        this.jsContext = jsContext;
        this.activity = activity;
        this.context = activity;
}

this.imag = (Imag) ScriptableObject.getTopLevelScope(this);
this.jsContext = imag.getJsContext();
this.activity = imag.getActivity();

解析xml

ImagParser

	public void parse(Page page, String xml) {
		Document doc = null;
		try {
			doc = DocumentHelper.parseText(xml);
		} catch (DocumentException e) {
			ExceptionUtil.dealPageXmlException(page, e, xml);
		}
		if (doc != null) {
			createImagObject(page); //设置"$", "$C", "alert", "confirm", "prompt", "hint", "exit", "log", "eval", "importScripts"为全局方法
			registerObjects(page);  //将"Http",Phone,"Util",Sys", page等注入js变为可使用方法的类
			parsePageBody(page, doc); //解析xml
			parseScripts(page, doc); //解析脚本
			parseRelativeWidget(page, doc); //解析相对控件
		}
	}

BodyParser

  public void parse(Page page, Element imagNode) throws Exception {
		Element pageNode = (Element) imagNode.selectSingleNode("page");
		page.setType(pageNode.attributeValue("type"));
		page.setScreen(pageNode.attributeValue("screen"));
		page.setOrientation(pageNode.attributeValue("orientation"));
		page.setOnload(pageNode.attributeValue("onload"));
		page.setOnunload(pageNode.attributeValue("onunload"));
		page.setOnactive(pageNode.attributeValue("onactive"));
		page.setOninactive(pageNode.attributeValue("oninactive"));
		page.setOnbeforeload(pageNode.attributeValue("onbeforeload"));
		page.setOnexit(pageNode.attributeValue("onexit"));
		page.setOnback(pageNode.attributeValue("onback"));
		page.setOnhomepressed(pageNode.attributeValue("onhomepressed"));
		page.setOnhomelongpressed(pageNode.attributeValue("onhomelongpressed"));
		page.setOnshake(pageNode.attributeValue("onshake"));
		page.setInclude(pageNode.attributeValue("include"));
		Element tabsNode = (Element) pageNode.selectSingleNode("tabs");
		if (tabsNode != null) {
			parseTab(page, tabsNode);
		} else {
			parseSlidingMemu(page, pageNode);
			parseBody(page, pageNode);
		}
		parsePathMenu(page, pageNode);
	}

  private void parseTitle(Page page, Body body, Element pageNode) {
        Element titleNode = (Element) pageNode.selectSingleNode("title");
        if (titleNode != null) {
            try {
                Title title = (Title) new TitleParser().parse(page, null, titleNode);
                if (title != null) {
                    body.setTitle(title);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void parseContents(Page page, Body body, Node itemNode) {
      Element contentsNode = (Element) itemNode.selectSingleNode("contents");
      if (contentsNode != null) {
          try {
              Contents contents = (Contents) new ContentsParser().parse(page, null, contentsNode);
              body.setContents(contents);
          } catch (Exception e) {
              e.printStackTrace();
          }
      } else {
          Contents contents = (Contents) ScriptUtils.newObject(page, "Contents", JsContents.class);
          body.setContents(contents);
          List<Element> contentNodes = (List<Element>) itemNode.selectNodes("content");
          for (Element contentNode : contentNodes) {
              try {
                  Content content = (Content) new ContentParser().parse(page, null, contentNode);
                  if (content != null) {
                      contents.addContent(content);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }

TitleParser<--AbstractWidgetParser<--WidgetParser //todo

脚本

private void parseScripts(Page page, Document doc) {
  List<Element> scriptNodes = (List<Element>) doc.selectNodes("//script");
  for (Element scriptNode : scriptNodes) {
    ScriptUtils.eval(page.getImag(), scriptNode.getText());
  }
}

public static Object eval(Imag imag, String script) {
		if (StringUtils.isNotBlank(script)) {
			try {
				return imag.getJsContext().evaluateString(imag, script, "script", 1, null);
			} catch (Exception e) {
				ExceptionUtil.dealScriptException(imag.getContext(), e);
			}
		}
		return null;
	}