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 |
-
进入 entry: onStart---->onResume---->onAttachedToWindow------->onWindowVisibilityChanged--visibility=0---------->onWindowFocusChanged(true)------->
-
退出应用 exit: onPause---->onStop---->onWindowFocusChanged(false) ---------------------- (lockscreen)
-
返回上一个界面 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;
}