You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by so...@apache.org on 2017/06/15 07:17:35 UTC

[1/8] incubator-weex git commit: modify activity event

Repository: incubator-weex
Updated Branches:
  refs/heads/0.14-dev 63e0f457b -> 38b29900f


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/8c705e9a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 2db6fb3..6eaac07 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -18,6 +18,7 @@
  */
 package com.taobao.weex;
 
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -81,6 +82,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
 
@@ -89,1478 +91,1519 @@ import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
  * Each instance of WXSDKInstance represents an running weex instance.
  * It can be a pure weex view, or mixed with native view
  */
-public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.OnLayoutChangeListener {
-
-  //Performance
-  public boolean mEnd = false;
-  public static final String BUNDLE_URL = "bundleUrl";
-  private IWXUserTrackAdapter mUserTrackAdapter;
-  private IWXRenderListener mRenderListener;
-  private IWXStatisticsListener mStatisticsListener;
-  /** package **/ Context mContext;
-  private final String mInstanceId;
-  private RenderContainer mRenderContainer;
-  private WXComponent mRootComp;
-  private boolean mRendered;
-  private WXRefreshData mLastRefreshData;
-  private NestedInstanceInterceptor mNestedInstanceInterceptor;
-  private String mBundleUrl = "";
-  private boolean isDestroy=false;
-  private Map<String,Serializable> mUserTrackParams;
-  private NativeInvokeHelper mNativeInvokeHelper;
-  private boolean isCommit=false;
-  private WXGlobalEventReceiver mGlobalEventReceiver=null;
-  private boolean trackComponent;
-  private boolean enableLayerType = true;
-  private boolean mNeedValidate = false;
-  private static volatile int mViewPortWidth = 750;
-  private int mInstanceViewPortWidth = 750;
-
-  /**
-   * Render strategy.
-   */
-  private WXRenderStrategy mRenderStrategy = WXRenderStrategy.APPEND_ASYNC;
-  /**
-   * Render start time
-   */
-  private long mRenderStartTime;
-  /**
-   * Refresh start time
-   */
-  private long mRefreshStartTime;
-  private WXPerformance mWXPerformance;
-  private ScrollView mScrollView;
-  private WXScrollViewListener mWXScrollViewListener;
-
-  private List<OnWXScrollListener> mWXScrollListeners;
-
-  /**
-   * whether we are in preRender mode
-   * */
-  private volatile boolean isPreRenderMode;
-
-  private LayoutFinishListener mLayoutFinishListener;
-
-
-  /**
-   * If anchor is created manually(etc. define a layout xml resource ),
-   * be aware do not add it to twice when {@link IWXRenderListener#onViewCreated(WXSDKInstance, View)}.
-   * @param a
-   */
-  public void setRenderContainer(RenderContainer a){
-    if(a != null) {
-      a.setSDKInstance(this);
-      a.addOnLayoutChangeListener(this);
-    }
-    mRenderContainer = a;
-  }
-
-
-
-  private int mMaxDeepLayer;
-
-  public boolean isTrackComponent() {
-    return trackComponent;
-  }
-
-  public void setTrackComponent(boolean trackComponent) {
-    this.trackComponent = trackComponent;
-  }
-
-  /**
-   * Tell whether it is enabled to change the layerType
-   * {@link android.view.View#setLayerType(int, Paint)}
-   * @return True for enable to change the layerType of component, false otherwise. The default
-   * is True
-   */
-  public boolean isLayerTypeEnabled() {
-    return enableLayerType;
-  }
-
-  /**
-   * Enable the ability of changing layerType. e.g. {@link android.view.View#setLayerType(int, Paint)}
-   * Disable the ability of changing layerType will have tremendous <strong>performance
-   * punishment</strong>.
-   *
-   * <strong>Do not</strong> set this to false unless you know exactly what you are doing.
-   * @param enable True for enable to change the layerType of component, false otherwise. The default
-   * is True
-   */
-  public void enableLayerType(boolean enable) {
-    enableLayerType = enable;
-  }
-
-  public boolean isNeedValidate() {
-    return mNeedValidate;
-  }
-
-  /*
-  *  Warning: use setInstanceViewPortWidth instead.
-  *  store custom ViewPort Width
-  */
-  @Deprecated
-  public void setViewPortWidth(int viewPortWidth) {
-    mViewPortWidth = viewPortWidth;
-  }
-
-  /**
-   * Warning: use getInstanceViewPortWidth instead.
-   * @return
-   */
-  @Deprecated
-  public static int getViewPortWidth() {
-    return mViewPortWidth;
-  }
-
-  public void setInstanceViewPortWidth(int instanceViewPortWidth) {
-    this.mInstanceViewPortWidth = instanceViewPortWidth;
-  }
-
-  public int getInstanceViewPortWidth(){
-    return mInstanceViewPortWidth;
-  }
-
-  public interface OnInstanceVisibleListener{
-    void onAppear();
-    void onDisappear();
-  }
-  private List<OnInstanceVisibleListener> mVisibleListeners = new ArrayList<>();
-
-  public WXSDKInstance(Context context) {
-    mInstanceId = WXSDKManager.getInstance().generateInstanceId();
-    init(context);
-  }
-
-  /**
-   * For unittest only.
-   */
-  WXSDKInstance(Context context,String id) {
-    mInstanceId = id;
-    init(context);
-  }
-
-
-  public WXComponent getRootComponent() {
-    return mRootComp;
-  }
-
-  public void setNestedInstanceInterceptor(NestedInstanceInterceptor interceptor){
-    mNestedInstanceInterceptor = interceptor;
-  }
-
-  public WXSDKInstance createNestedInstance(NestedContainer container){
-    WXSDKInstance sdkInstance = new WXSDKInstance(mContext);
-    if(mNestedInstanceInterceptor != null){
-      mNestedInstanceInterceptor.onCreateNestInstance(sdkInstance,container);
-    }
-    return sdkInstance;
-  }
-
-  public void addOnInstanceVisibleListener(OnInstanceVisibleListener l){
-    mVisibleListeners.add(l);
-  }
-
-  public void removeOnInstanceVisibleListener(OnInstanceVisibleListener l){
-    mVisibleListeners.remove(l);
-  }
-
-  public void init(Context context) {
-    mContext = context;
-    mNativeInvokeHelper = new NativeInvokeHelper(mInstanceId);
-
-    mWXPerformance = new WXPerformance();
-    mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
-    mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
-
-    mUserTrackAdapter=WXSDKManager.getInstance().getIWXUserTrackAdapter();
-  }
-
-  public NativeInvokeHelper getNativeInvokeHelper() {
-    return mNativeInvokeHelper;
-  }
-
-  public void setBizType(String bizType) {
-    if (!TextUtils.isEmpty(bizType)) {
-      mWXPerformance.bizType = bizType;
-    }
-  }
-
-  public ScrollView getScrollView() {
-    return mScrollView;
-  }
-
-  public void setRootScrollView(ScrollView scrollView) {
-    mScrollView = scrollView;
-    if (mWXScrollViewListener != null) {
-      ((WXScrollView) mScrollView).addScrollViewListener(mWXScrollViewListener);
-    }
-  }
-
-  @Deprecated
-  public void registerScrollViewListener(WXScrollViewListener scrollViewListener) {
-    mWXScrollViewListener = scrollViewListener;
-  }
-
-  @Deprecated
-  public WXScrollViewListener getScrollViewListener() {
-    return mWXScrollViewListener;
-  }
-
-  @Deprecated
-  public void setIWXUserTrackAdapter(IWXUserTrackAdapter adapter) {
-  }
-
-  /**
-   * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
-   * @param template bundle js
-   * @param options  os   iphone/android/ipad
-   *                 weexversion    Weex version(like 1.0.0)
-   *                 appversion     App version(like 1.0.0)
-   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-   *                 Time    UNIX timestamp, UTC+08:00
-   *                 TTID(Optional)
-   *                 MarkertId
-   *                 Appname(Optional)  tm,tb,qa
-   *                 Bundleurl(Optional)  template url
-   * @param jsonInitData Initial data for rendering
-   */
-  public void render(String template, Map<String, Object> options, String jsonInitData) {
-    render(template, options, jsonInitData, WXRenderStrategy.APPEND_ASYNC);
-  }
-
-  /**
-   * Render template asynchronously
-   * @param template bundle js
-   * @param options  os   iphone/android/ipad
-   *                 weexversion    Weex version(like 1.0.0)
-   *                 appversion     App version(like 1.0.0)
-   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-   *                 Time    UNIX timestamp, UTC+08:00
-   *                 TTID(Optional)
-   *                 MarkertId
-   *                 Appname(Optional)  tm,tb,qa
-   *                 Bundleurl(Optional)  template url
-   * @param jsonInitData Initial data for rendering
-   * @param flag     RenderStrategy {@link WXRenderStrategy}
-   */
-  @Deprecated
-  public void render(String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
-    render(WXPerformance.DEFAULT, template, options, jsonInitData, flag);
-  }
-
-  /**
-   * Render template asynchronously
-   *
-   * @param pageName, used for performance log.
-   * @param template bundle js
-   * @param options  os   iphone/android/ipad
-   *                 weexversion    Weex version(like 1.0.0)
-   *                 appversion     App version(like 1.0.0)
-   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-   *                 Time    UNIX timestamp, UTC+08:00
-   *                 TTID(Optional)
-   *                 MarkertId
-   *                 Appname(Optional)  tm,tb,qa
-   *                 Bundleurl(Optional)  template url
-   * @param jsonInitData Initial data for rendering
-   * @param flag     RenderStrategy {@link WXRenderStrategy}
-   */
-  public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
-    if(WXEnvironment.isApkDebugable() && WXPerformance.DEFAULT.equals(pageName)){
-       WXLogUtils.e("Please set your pageName or your js bundle url !!!!!!!");
-       return;
-    }
-    renderInternal(pageName,template,options,jsonInitData,flag);
-  }
-
-  private void ensureRenderArchor(){
-    if(mRenderContainer == null){
-      mRenderContainer = new RenderContainer(getContext());
-      mRenderContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-      mRenderContainer.setBackgroundColor(Color.TRANSPARENT);
-      mRenderContainer.setSDKInstance(this);
-      mRenderContainer.addOnLayoutChangeListener(this);
-    }
-  }
-
-  private void renderInternal(String pageName,
-                              String template,
-                              Map<String, Object> options,
-                              String jsonInitData,
-                              WXRenderStrategy flag){
-    if (mRendered || TextUtils.isEmpty(template)) {
-      return;
-    }
-
-    ensureRenderArchor();
-
-    Map<String, Object> renderOptions = options;
-    if (renderOptions == null) {
-      renderOptions = new HashMap<>();
-    }
-
-    if (WXEnvironment.sDynamicMode && !TextUtils.isEmpty(WXEnvironment.sDynamicUrl) && renderOptions.get("dynamicMode") == null) {
-      renderOptions.put("dynamicMode", "true");
-      renderByUrl(pageName, WXEnvironment.sDynamicUrl, renderOptions, jsonInitData, flag);
-      return;
-    }
-
-    mWXPerformance.pageName = pageName;
-    mWXPerformance.JSTemplateSize = template.length() / 1024;
-
-    mRenderStartTime = System.currentTimeMillis();
-    mRenderStrategy = flag;
-
-    WXSDKManager.getInstance().setCrashInfo(WXEnvironment.WEEX_CURRENT_KEY,pageName);
-
-    WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData);
-    mRendered = true;
-
-    if (TextUtils.isEmpty(mBundleUrl)) {
-      mBundleUrl = pageName;
-    }
-  }
-
-  private void renderByUrlInternal(String pageName,
-                                   final String url,
-                                   Map<String, Object> options,
-                                   final String jsonInitData,
-                                   final WXRenderStrategy flag) {
-
-    ensureRenderArchor();
-    pageName = wrapPageName(pageName, url);
-    mBundleUrl = url;
-    if(WXSDKManager.getInstance().getValidateProcessor()!=null) {
-      mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
-    }
-
-    Map<String, Object> renderOptions = options;
-    if (renderOptions == null) {
-      renderOptions = new HashMap<>();
-    }
-    if (!renderOptions.containsKey(BUNDLE_URL)) {
-      renderOptions.put(BUNDLE_URL, url);
-    }
-
-    Uri uri = Uri.parse(url);
-    if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
-      render(pageName, WXFileUtils.loadFileOrAsset(assembleFilePath(uri), mContext), renderOptions, jsonInitData, flag);
-      return;
-    }
-
-    IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
-
-    WXRequest wxRequest = new WXRequest();
-    wxRequest.url = rewriteUri(Uri.parse(url),URIAdapter.BUNDLE).toString();
-    if (wxRequest.paramMap == null) {
-      wxRequest.paramMap = new HashMap<String, String>();
-    }
-    wxRequest.paramMap.put(KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(mContext,WXEnvironment.getConfig()));
-    WXHttpListener httpListener =
-        new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
-    httpListener.setSDKInstance(this);
-    adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) httpListener);
-  }
-
-  /**
-   * Use {@link #render(String, String, Map, String, WXRenderStrategy)} instead.
-   * @param pageName
-   * @param template
-   * @param options
-   * @param jsonInitData
-   * @param width
-   * @param height
-   * @param flag
-   */
-  @Deprecated
-  public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, int width, int height, WXRenderStrategy flag) {
-    render(pageName,template,options,jsonInitData,flag);
-  }
-
-  /**
-   * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
-   * @param template bundle js
-   */
-  public void render(String template) {
-    render(WXPerformance.DEFAULT, template, null, null, mRenderStrategy);
-  }
-
-  /**
-   * Use {@link #render(String)} instead.
-   * @param template
-   * @param width
-   * @param height
-   */
-  @Deprecated
-  public void render(String template, int width, int height) {
-    render(template);
-  }
-
-  /**
-   * Use {@link #renderByUrl(String, String, Map, String, WXRenderStrategy)} instead.
-   * @param pageName
-   * @param url
-   * @param options
-   * @param jsonInitData
-   * @param width
-   * @param height
-   * @param flag
-   */
-  @Deprecated
-  public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final int width, final int height, final WXRenderStrategy flag){
-    renderByUrl(pageName,url,options,jsonInitData,flag);
-  }
-
-  public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final WXRenderStrategy flag) {
-    renderByUrlInternal(pageName,url,options,jsonInitData,flag);
-  }
-
-  private String wrapPageName(String pageName, String url) {
-    if(TextUtils.equals(pageName, WXPerformance.DEFAULT)){
-      pageName=url;
-      try {
-        Uri uri=Uri.parse(url);
-        if(uri!=null){
-          Uri.Builder builder=new Uri.Builder();
-          builder.scheme(uri.getScheme());
-          builder.authority(uri.getAuthority());
-          builder.path(uri.getPath());
-          pageName=builder.toString();
-        }
-      } catch (Exception e) {
-      }
-    }
-    return pageName;
-  }
-
-  private String assembleFilePath(Uri uri) {
-    if(uri!=null && uri.getPath()!=null){
-      return uri.getPath().replaceFirst("/","");
-    }
-    return "";
-  }
-
-  /**
-   * Refresh instance asynchronously.
-   * @param data the new data
-   */
-  public void refreshInstance(Map<String, Object> data) {
-    if (data == null) {
-      return;
-    }
-    refreshInstance(WXJsonUtils.fromObjectToJSONString(data));
-  }
-
-  /**
-   * Refresh instance asynchronously.
-   * @param jsonData the new data
-   */
-  public void refreshInstance(String jsonData) {
-    if (jsonData == null) {
-      return;
-    }
-    mRefreshStartTime = System.currentTimeMillis();
-    //cancel last refresh message
-    if (mLastRefreshData != null) {
-      mLastRefreshData.isDirty = true;
-    }
-
-    mLastRefreshData = new WXRefreshData(jsonData, false);
-
-    WXSDKManager.getInstance().refreshInstance(mInstanceId, mLastRefreshData);
-  }
-
-  public WXRenderStrategy getRenderStrategy() {
-    return mRenderStrategy;
-  }
-
-  @Override
-  public Context getUIContext() {
-    return mContext;
-  }
-
-  public String getInstanceId() {
-    return mInstanceId;
-  }
-
-  public Context getContext() {
-    if(mContext == null){
-      WXLogUtils.e("WXSdkInstance mContext == null");
-    }
-    return mContext;
-  }
-
-  public int getWeexHeight() {
-    return mRenderContainer == null ? 0: mRenderContainer.getHeight();
-  }
-
-  public int getWeexWidth() {
-    return mRenderContainer == null ? 0: mRenderContainer.getWidth();
-  }
-
-
-  public IWXImgLoaderAdapter getImgLoaderAdapter() {
-    return WXSDKManager.getInstance().getIWXImgLoaderAdapter();
-  }
-
-  public IDrawableLoader getDrawableLoader() {
-    return WXSDKManager.getInstance().getDrawableLoader();
-  }
+public class WXSDKInstance implements IWXActivityStateListener, DomContext, View.OnLayoutChangeListener {
+
+    //Performance
+    public boolean mEnd = false;
+    public static final String BUNDLE_URL = "bundleUrl";
+    private IWXUserTrackAdapter mUserTrackAdapter;
+    private IWXRenderListener mRenderListener;
+    private IWXStatisticsListener mStatisticsListener;
+    /**
+     * package
+     **/
+    Context mContext;
+    private final String mInstanceId;
+    private RenderContainer mRenderContainer;
+    private WXComponent mRootComp;
+    private boolean mRendered;
+    private WXRefreshData mLastRefreshData;
+    private NestedInstanceInterceptor mNestedInstanceInterceptor;
+    private String mBundleUrl = "";
+    private boolean isDestroy = false;
+    private Map<String, Serializable> mUserTrackParams;
+    private NativeInvokeHelper mNativeInvokeHelper;
+    private boolean isCommit = false;
+    private WXGlobalEventReceiver mGlobalEventReceiver = null;
+    private boolean trackComponent;
+    private boolean enableLayerType = true;
+    private boolean mNeedValidate = false;
+    private static volatile int mViewPortWidth = 750;
+    private int mInstanceViewPortWidth = 750;
+
+    /**
+     * Render strategy.
+     */
+    private WXRenderStrategy mRenderStrategy = WXRenderStrategy.APPEND_ASYNC;
+    /**
+     * Render start time
+     */
+    private long mRenderStartTime;
+    /**
+     * Refresh start time
+     */
+    private long mRefreshStartTime;
+    private WXPerformance mWXPerformance;
+    private ScrollView mScrollView;
+    private WXScrollViewListener mWXScrollViewListener;
+
+    private List<OnWXScrollListener> mWXScrollListeners;
+
+    /**
+     * whether we are in preRender mode
+     */
+    private volatile boolean isPreRenderMode;
+
+    private LayoutFinishListener mLayoutFinishListener;
+
+
+    /**
+     * If anchor is created manually(etc. define a layout xml resource ),
+     * be aware do not add it to twice when {@link IWXRenderListener#onViewCreated(WXSDKInstance, View)}.
+     *
+     * @param a
+     */
+    public void setRenderContainer(RenderContainer a) {
+        if (a != null) {
+            a.setSDKInstance(this);
+            a.addOnLayoutChangeListener(this);
+        }
+        mRenderContainer = a;
+    }
 
-  public URIAdapter getURIAdapter(){
-    return WXSDKManager.getInstance().getURIAdapter();
-  }
 
-  public Uri rewriteUri(Uri uri,String type){
-    return getURIAdapter().rewrite(this,type,uri);
-  }
+    private int mMaxDeepLayer;
 
-  public IWXHttpAdapter getWXHttpAdapter() {
-    return WXSDKManager.getInstance().getIWXHttpAdapter();
-  }
+    public boolean isTrackComponent() {
+        return trackComponent;
+    }
 
-  public IWXStatisticsListener getWXStatisticsListener() {
-    return mStatisticsListener;
-  }
+    public void setTrackComponent(boolean trackComponent) {
+        this.trackComponent = trackComponent;
+    }
 
-  public @Nullable
-  IWebSocketAdapter getWXWebSocketAdapter() {
-    return WXSDKManager.getInstance().getIWXWebSocketAdapter();
-  }
+    /**
+     * Tell whether it is enabled to change the layerType
+     * {@link android.view.View#setLayerType(int, Paint)}
+     *
+     * @return True for enable to change the layerType of component, false otherwise. The default
+     * is True
+     */
+    public boolean isLayerTypeEnabled() {
+        return enableLayerType;
+    }
 
-  @Deprecated
-  public void reloadImages() {
-    if (mScrollView == null) {
-      return;
+    /**
+     * Enable the ability of changing layerType. e.g. {@link android.view.View#setLayerType(int, Paint)}
+     * Disable the ability of changing layerType will have tremendous <strong>performance
+     * punishment</strong>.
+     * <p>
+     * <strong>Do not</strong> set this to false unless you know exactly what you are doing.
+     *
+     * @param enable True for enable to change the layerType of component, false otherwise. The default
+     *               is True
+     */
+    public void enableLayerType(boolean enable) {
+        enableLayerType = enable;
     }
-  }
 
+    public boolean isNeedValidate() {
+        return mNeedValidate;
+    }
 
-  public boolean isPreRenderMode() {
-    return this.isPreRenderMode;
-  }
+    /*
+    *  Warning: use setInstanceViewPortWidth instead.
+    *  store custom ViewPort Width
+    */
+    @Deprecated
+    public void setViewPortWidth(int viewPortWidth) {
+        mViewPortWidth = viewPortWidth;
+    }
 
-  public void setPreRenderMode(final boolean isPreRenderMode) {
-    WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        WXSDKInstance.this.isPreRenderMode = isPreRenderMode;
-      }
-    },0);
-  }
+    /**
+     * Warning: use getInstanceViewPortWidth instead.
+     *
+     * @return
+     */
+    @Deprecated
+    public static int getViewPortWidth() {
+        return mViewPortWidth;
+    }
 
-  public void setContext(@NonNull Context context) {
-    this.mContext = context;
-  }
+    public void setInstanceViewPortWidth(int instanceViewPortWidth) {
+        this.mInstanceViewPortWidth = instanceViewPortWidth;
+    }
 
-  /********************************
-   * begin register listener
-   ********************************************************/
-  public void registerRenderListener(IWXRenderListener listener) {
-    mRenderListener = listener;
-  }
+    public int getInstanceViewPortWidth() {
+        return mInstanceViewPortWidth;
+    }
 
-  @Deprecated
-  public void registerActivityStateListener(IWXActivityStateListener listener) {
+    public interface OnInstanceVisibleListener {
+        void onAppear();
 
-  }
+        void onDisappear();
+    }
 
-  public void registerStatisticsListener(IWXStatisticsListener listener) {
-    mStatisticsListener = listener;
-  }
+    private List<OnInstanceVisibleListener> mVisibleListeners = new ArrayList<>();
 
-  public void setLayoutFinishListener(@Nullable LayoutFinishListener listener) {
-    this.mLayoutFinishListener = listener;
-  }
+    public WXSDKInstance(Context context) {
+        mInstanceId = WXSDKManager.getInstance().generateInstanceId();
+        init(context);
+    }
 
-  public LayoutFinishListener getLayoutFinishListener() {
-    return this.mLayoutFinishListener;
-  }
+    /**
+     * For unittest only.
+     */
+    WXSDKInstance(Context context, String id) {
+        mInstanceId = id;
+        init(context);
+    }
 
 
-  /**set render start time*/
-  public void setRenderStartTime(long renderStartTime) {
-    this.mRenderStartTime = renderStartTime;
-  }
+    public WXComponent getRootComponent() {
+        return mRootComp;
+    }
 
-  /********************************
-   * end register listener
-   ********************************************************/
+    public void setNestedInstanceInterceptor(NestedInstanceInterceptor interceptor) {
+        mNestedInstanceInterceptor = interceptor;
+    }
 
+    public WXSDKInstance createNestedInstance(NestedContainer container) {
+        WXSDKInstance sdkInstance = new WXSDKInstance(mContext);
+        if (mNestedInstanceInterceptor != null) {
+            mNestedInstanceInterceptor.onCreateNestInstance(sdkInstance, container);
+        }
+        return sdkInstance;
+    }
 
-  /********************************
-   *  begin hook Activity life cycle callback
-   ********************************************************/
+    public void addOnInstanceVisibleListener(OnInstanceVisibleListener l) {
+        mVisibleListeners.add(l);
+    }
 
-  @Override
-  public void onActivityCreate() {
+    public void removeOnInstanceVisibleListener(OnInstanceVisibleListener l) {
+        mVisibleListeners.remove(l);
+    }
 
-    // module listen Activity onActivityCreate
-    WXModuleManager.onActivityCreate(getInstanceId());
+    private ActivityManager mActivityManager;
 
-    if(mRootComp != null) {
-      mRootComp.onActivityCreate();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely,onActivityCreate can not be call!");
-    }
+    public void init(Context context) {
+        mContext = context;
+        mNativeInvokeHelper = new NativeInvokeHelper(mInstanceId);
 
-    mGlobalEventReceiver=new WXGlobalEventReceiver(this);
-    getContext().registerReceiver(mGlobalEventReceiver,new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
-  }
+        mWXPerformance = new WXPerformance();
+        mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
+        mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
 
-  @Override
-  public void onActivityStart() {
+        mUserTrackAdapter = WXSDKManager.getInstance().getIWXUserTrackAdapter();
 
-    // module listen Activity onActivityCreate
-    WXModuleManager.onActivityStart(getInstanceId());
-    if(mRootComp != null) {
-      mRootComp.onActivityStart();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
     }
 
-  }
+    public NativeInvokeHelper getNativeInvokeHelper() {
+        return mNativeInvokeHelper;
+    }
 
-  public boolean onCreateOptionsMenu(Menu menu) {
+    public void setBizType(String bizType) {
+        if (!TextUtils.isEmpty(bizType)) {
+            mWXPerformance.bizType = bizType;
+        }
+    }
 
-    WXModuleManager.onCreateOptionsMenu(getInstanceId(),menu);
-    if(mRootComp != null) {
-      mRootComp.onCreateOptionsMenu(menu);
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
+    public ScrollView getScrollView() {
+        return mScrollView;
     }
-    return true;
-  }
 
-  @Override
-  public void onActivityPause() {
-    onViewDisappear();
-    if(!isCommit){
-      Set<String> componentTypes= WXComponentFactory.getComponentTypesByInstanceId(getInstanceId());
-      if(componentTypes!=null && componentTypes.contains(WXBasicComponentType.SCROLLER)){
-        mWXPerformance.useScroller=1;
-      }
-      mWXPerformance.maxDeepViewLayer=getMaxDeepLayer();
-      if (mUserTrackAdapter != null) {
-        mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, mWXPerformance, getUserTrackParams());
-      }
-      isCommit=true;
+    public void setRootScrollView(ScrollView scrollView) {
+        mScrollView = scrollView;
+        if (mWXScrollViewListener != null) {
+            ((WXScrollView) mScrollView).addScrollViewListener(mWXScrollViewListener);
+        }
     }
-    // module listen Activity onActivityPause
-    WXModuleManager.onActivityPause(getInstanceId());
-    if(mRootComp != null) {
-      mRootComp.onActivityPause();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely,onActivityPause can not be call!");
+
+    @Deprecated
+    public void registerScrollViewListener(WXScrollViewListener scrollViewListener) {
+        mWXScrollViewListener = scrollViewListener;
+    }
+
+    @Deprecated
+    public WXScrollViewListener getScrollViewListener() {
+        return mWXScrollViewListener;
+    }
+
+    @Deprecated
+    public void setIWXUserTrackAdapter(IWXUserTrackAdapter adapter) {
+    }
+
+    /**
+     * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
+     *
+     * @param template     bundle js
+     * @param options      os   iphone/android/ipad
+     *                     weexversion    Weex version(like 1.0.0)
+     *                     appversion     App version(like 1.0.0)
+     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+     *                     Time    UNIX timestamp, UTC+08:00
+     *                     TTID(Optional)
+     *                     MarkertId
+     *                     Appname(Optional)  tm,tb,qa
+     *                     Bundleurl(Optional)  template url
+     * @param jsonInitData Initial data for rendering
+     */
+    public void render(String template, Map<String, Object> options, String jsonInitData) {
+        render(template, options, jsonInitData, WXRenderStrategy.APPEND_ASYNC);
+    }
+
+    /**
+     * Render template asynchronously
+     *
+     * @param template     bundle js
+     * @param options      os   iphone/android/ipad
+     *                     weexversion    Weex version(like 1.0.0)
+     *                     appversion     App version(like 1.0.0)
+     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+     *                     Time    UNIX timestamp, UTC+08:00
+     *                     TTID(Optional)
+     *                     MarkertId
+     *                     Appname(Optional)  tm,tb,qa
+     *                     Bundleurl(Optional)  template url
+     * @param jsonInitData Initial data for rendering
+     * @param flag         RenderStrategy {@link WXRenderStrategy}
+     */
+    @Deprecated
+    public void render(String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
+        render(WXPerformance.DEFAULT, template, options, jsonInitData, flag);
+    }
+
+    /**
+     * Render template asynchronously
+     *
+     * @param pageName,    used for performance log.
+     * @param template     bundle js
+     * @param options      os   iphone/android/ipad
+     *                     weexversion    Weex version(like 1.0.0)
+     *                     appversion     App version(like 1.0.0)
+     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+     *                     Time    UNIX timestamp, UTC+08:00
+     *                     TTID(Optional)
+     *                     MarkertId
+     *                     Appname(Optional)  tm,tb,qa
+     *                     Bundleurl(Optional)  template url
+     * @param jsonInitData Initial data for rendering
+     * @param flag         RenderStrategy {@link WXRenderStrategy}
+     */
+    public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
+        if (WXEnvironment.isApkDebugable() && WXPerformance.DEFAULT.equals(pageName)) {
+            WXLogUtils.e("Please set your pageName or your js bundle url !!!!!!!");
+            return;
+        }
+        renderInternal(pageName, template, options, jsonInitData, flag);
     }
 
-    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.PAUSE_EVENT);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
-    mContext.sendBroadcast(intent);
-  }
+    private void ensureRenderArchor() {
+        if (mRenderContainer == null) {
+            mRenderContainer = new RenderContainer(getContext());
+            mRenderContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+            mRenderContainer.setBackgroundColor(Color.TRANSPARENT);
+            mRenderContainer.setSDKInstance(this);
+            mRenderContainer.addOnLayoutChangeListener(this);
+        }
+    }
 
+    private void renderInternal(String pageName,
+                                String template,
+                                Map<String, Object> options,
+                                String jsonInitData,
+                                WXRenderStrategy flag) {
+        if (mRendered || TextUtils.isEmpty(template)) {
+            return;
+        }
 
-  @Override
-  public void onActivityResume() {
+        ensureRenderArchor();
 
-    // notify onActivityResume callback to module
-    WXModuleManager.onActivityResume(getInstanceId());
+        Map<String, Object> renderOptions = options;
+        if (renderOptions == null) {
+            renderOptions = new HashMap<>();
+        }
 
-    if(mRootComp != null) {
-      mRootComp.onActivityResume();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
+        if (WXEnvironment.sDynamicMode && !TextUtils.isEmpty(WXEnvironment.sDynamicUrl) && renderOptions.get("dynamicMode") == null) {
+            renderOptions.put("dynamicMode", "true");
+            renderByUrl(pageName, WXEnvironment.sDynamicUrl, renderOptions, jsonInitData, flag);
+            return;
+        }
+
+        mWXPerformance.pageName = pageName;
+        mWXPerformance.JSTemplateSize = template.length() / 1024;
+
+        mRenderStartTime = System.currentTimeMillis();
+        mRenderStrategy = flag;
+
+        WXSDKManager.getInstance().setCrashInfo(WXEnvironment.WEEX_CURRENT_KEY, pageName);
+
+        WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData);
+        mRendered = true;
+
+        if (TextUtils.isEmpty(mBundleUrl)) {
+            mBundleUrl = pageName;
+        }
     }
 
-    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.RESUME_EVENT);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
-    mContext.sendBroadcast(intent);
+    private void renderByUrlInternal(String pageName,
+                                     final String url,
+                                     Map<String, Object> options,
+                                     final String jsonInitData,
+                                     final WXRenderStrategy flag) {
+
+        ensureRenderArchor();
+        pageName = wrapPageName(pageName, url);
+        mBundleUrl = url;
+        if (WXSDKManager.getInstance().getValidateProcessor() != null) {
+            mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
+        }
+
+        Map<String, Object> renderOptions = options;
+        if (renderOptions == null) {
+            renderOptions = new HashMap<>();
+        }
+        if (!renderOptions.containsKey(BUNDLE_URL)) {
+            renderOptions.put(BUNDLE_URL, url);
+        }
 
-    onViewAppear();
+        Uri uri = Uri.parse(url);
+        if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
+            render(pageName, WXFileUtils.loadFileOrAsset(assembleFilePath(uri), mContext), renderOptions, jsonInitData, flag);
+            return;
+        }
 
-    setViewPortWidth(mInstanceViewPortWidth);
-  }
+        IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
 
-  @Override
-  public void onActivityStop() {
+        WXRequest wxRequest = new WXRequest();
+        wxRequest.url = rewriteUri(Uri.parse(url), URIAdapter.BUNDLE).toString();
+        if (wxRequest.paramMap == null) {
+            wxRequest.paramMap = new HashMap<String, String>();
+        }
+        wxRequest.paramMap.put(KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(mContext, WXEnvironment.getConfig()));
+        WXHttpListener httpListener =
+                new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
+        httpListener.setSDKInstance(this);
+        adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) httpListener);
+    }
+
+    /**
+     * Use {@link #render(String, String, Map, String, WXRenderStrategy)} instead.
+     *
+     * @param pageName
+     * @param template
+     * @param options
+     * @param jsonInitData
+     * @param width
+     * @param height
+     * @param flag
+     */
+    @Deprecated
+    public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, int width, int height, WXRenderStrategy flag) {
+        render(pageName, template, options, jsonInitData, flag);
+    }
 
-    // notify onActivityResume callback to module
-    WXModuleManager.onActivityStop(getInstanceId());
+    /**
+     * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
+     *
+     * @param template bundle js
+     */
+    public void render(String template) {
+        render(WXPerformance.DEFAULT, template, null, null, mRenderStrategy);
+    }
+
+    /**
+     * Use {@link #render(String)} instead.
+     *
+     * @param template
+     * @param width
+     * @param height
+     */
+    @Deprecated
+    public void render(String template, int width, int height) {
+        render(template);
+    }
+
+    /**
+     * Use {@link #renderByUrl(String, String, Map, String, WXRenderStrategy)} instead.
+     *
+     * @param pageName
+     * @param url
+     * @param options
+     * @param jsonInitData
+     * @param width
+     * @param height
+     * @param flag
+     */
+    @Deprecated
+    public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final int width, final int height, final WXRenderStrategy flag) {
+        renderByUrl(pageName, url, options, jsonInitData, flag);
+    }
+
+    public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final WXRenderStrategy flag) {
+        renderByUrlInternal(pageName, url, options, jsonInitData, flag);
+    }
+
+    private String wrapPageName(String pageName, String url) {
+        if (TextUtils.equals(pageName, WXPerformance.DEFAULT)) {
+            pageName = url;
+            try {
+                Uri uri = Uri.parse(url);
+                if (uri != null) {
+                    Uri.Builder builder = new Uri.Builder();
+                    builder.scheme(uri.getScheme());
+                    builder.authority(uri.getAuthority());
+                    builder.path(uri.getPath());
+                    pageName = builder.toString();
+                }
+            } catch (Exception e) {
+            }
+        }
+        return pageName;
+    }
 
-    if(mRootComp != null) {
-      mRootComp.onActivityStop();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onActivityStop can not be call!");
+    private String assembleFilePath(Uri uri) {
+        if (uri != null && uri.getPath() != null) {
+            return uri.getPath().replaceFirst("/", "");
+        }
+        return "";
     }
 
+    /**
+     * Refresh instance asynchronously.
+     *
+     * @param data the new data
+     */
+    public void refreshInstance(Map<String, Object> data) {
+        if (data == null) {
+            return;
+        }
+        refreshInstance(WXJsonUtils.fromObjectToJSONString(data));
+    }
 
-  }
+    /**
+     * Refresh instance asynchronously.
+     *
+     * @param jsonData the new data
+     */
+    public void refreshInstance(String jsonData) {
+        if (jsonData == null) {
+            return;
+        }
+        mRefreshStartTime = System.currentTimeMillis();
+        //cancel last refresh message
+        if (mLastRefreshData != null) {
+            mLastRefreshData.isDirty = true;
+        }
 
-  @Override
-  public void onActivityDestroy() {
-    WXModuleManager.onActivityDestroy(getInstanceId());
+        mLastRefreshData = new WXRefreshData(jsonData, false);
 
-    if(mRootComp != null) {
-      mRootComp.onActivityDestroy();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onActivityDestroy can not be call!");
+        WXSDKManager.getInstance().refreshInstance(mInstanceId, mLastRefreshData);
     }
 
-    destroy();
-  }
+    public WXRenderStrategy getRenderStrategy() {
+        return mRenderStrategy;
+    }
 
-  @Override
-  public boolean onActivityBack() {
+    @Override
+    public Context getUIContext() {
+        return mContext;
+    }
 
-    WXModuleManager.onActivityBack(getInstanceId());
+    public String getInstanceId() {
+        return mInstanceId;
+    }
 
-    if(mRootComp != null) {
-      return mRootComp.onActivityBack();
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onActivityBack can not be call!");
+    public Context getContext() {
+        if (mContext == null) {
+            WXLogUtils.e("WXSdkInstance mContext == null");
+        }
+        return mContext;
     }
 
-    return false;
-  }
+    public int getWeexHeight() {
+        return mRenderContainer == null ? 0 : mRenderContainer.getHeight();
+    }
 
-  public boolean onBackPressed() {
-    WXComponent comp = getRootComponent();
-    if(comp != null) {
-      WXEvent events= comp.getDomObject().getEvents();
-      boolean hasBackPressed = events.contains(Constants.Event.CLICKBACKITEM);
-      if (hasBackPressed) {
-        WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.CLICKBACKITEM,null, null);
-      }
-      return hasBackPressed;
+    public int getWeexWidth() {
+        return mRenderContainer == null ? 0 : mRenderContainer.getWidth();
     }
-    return false;
-  }
 
-    public void onActivityResult(int requestCode, int resultCode, Intent data){
-    WXModuleManager.onActivityResult(getInstanceId(),requestCode,resultCode,data);
 
-    if(mRootComp != null) {
-      mRootComp.onActivityResult(requestCode,resultCode,data);
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onActivityResult can not be call!");
+    public IWXImgLoaderAdapter getImgLoaderAdapter() {
+        return WXSDKManager.getInstance().getIWXImgLoaderAdapter();
     }
-  }
 
+    public IDrawableLoader getDrawableLoader() {
+        return WXSDKManager.getInstance().getDrawableLoader();
+    }
 
-  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+    public URIAdapter getURIAdapter() {
+        return WXSDKManager.getInstance().getURIAdapter();
+    }
 
-    WXModuleManager.onRequestPermissionsResult(getInstanceId(),requestCode,permissions,grantResults);
+    public Uri rewriteUri(Uri uri, String type) {
+        return getURIAdapter().rewrite(this, type, uri);
+    }
 
-    if(mRootComp != null) {
-       mRootComp.onRequestPermissionsResult(requestCode,permissions,grantResults);
-    }else{
-      WXLogUtils.w("Warning :Component tree has not build completely, onRequestPermissionsResult can not be call!");
+    public IWXHttpAdapter getWXHttpAdapter() {
+        return WXSDKManager.getInstance().getIWXHttpAdapter();
     }
-  }
 
-  /********************************
-   *  end hook Activity life cycle callback
-   ********************************************************/
+    public IWXStatisticsListener getWXStatisticsListener() {
+        return mStatisticsListener;
+    }
 
-  public void onViewDisappear(){
-    WXComponent comp = getRootComponent();
-    if(comp != null) {
-      WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWDISAPPEAR, null, null);
-      //call disappear of nested instances
-      for(OnInstanceVisibleListener instance:mVisibleListeners){
-        instance.onDisappear();
-      }
+    public
+    @Nullable
+    IWebSocketAdapter getWXWebSocketAdapter() {
+        return WXSDKManager.getInstance().getIWXWebSocketAdapter();
     }
-  }
 
-  public void onViewAppear(){
-    WXComponent comp = getRootComponent();
-    if(comp != null) {
-      WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWAPPEAR,null, null);
-      for(OnInstanceVisibleListener instance:mVisibleListeners){
-        instance.onAppear();
-      }
+    @Deprecated
+    public void reloadImages() {
+        if (mScrollView == null) {
+            return;
+        }
     }
-  }
 
 
-  public void onCreateFinish() {
-    if (mContext != null) {
-      runOnUiThread(new Runnable() {
+    public boolean isPreRenderMode() {
+        return this.isPreRenderMode;
+    }
 
-        @Override
-        public void run() {
-          if ( mContext != null) {
-            onViewAppear();
-            View wxView= mRenderContainer;
-            if(WXEnvironment.isApkDebugable() && WXSDKManager.getInstance().getIWXDebugAdapter()!=null){
-              wxView = WXSDKManager.getInstance().getIWXDebugAdapter().wrapContainer(WXSDKInstance.this,wxView);
+    public void setPreRenderMode(final boolean isPreRenderMode) {
+        WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                WXSDKInstance.this.isPreRenderMode = isPreRenderMode;
             }
-            if(mRenderListener != null) {
-              mRenderListener.onViewCreated(WXSDKInstance.this, wxView);
+        }, 0);
+    }
+
+    public void setContext(@NonNull Context context) {
+        this.mContext = context;
+    }
+
+    /********************************
+     * begin register listener
+     ********************************************************/
+    public void registerRenderListener(IWXRenderListener listener) {
+        mRenderListener = listener;
+    }
+
+    @Deprecated
+    public void registerActivityStateListener(IWXActivityStateListener listener) {
+
+    }
+
+    public void registerStatisticsListener(IWXStatisticsListener listener) {
+        mStatisticsListener = listener;
+    }
+
+    public void setLayoutFinishListener(@Nullable LayoutFinishListener listener) {
+        this.mLayoutFinishListener = listener;
+    }
+
+    public LayoutFinishListener getLayoutFinishListener() {
+        return this.mLayoutFinishListener;
+    }
+
+
+    /**
+     * set render start time
+     */
+    public void setRenderStartTime(long renderStartTime) {
+        this.mRenderStartTime = renderStartTime;
+    }
+
+    /********************************
+     * end register listener
+     ********************************************************/
+
+
+    /********************************
+     *  begin hook Activity life cycle callback
+     ********************************************************/
+
+    @Override
+    public void onActivityCreate() {
+
+        // module listen Activity onActivityCreate
+        WXModuleManager.onActivityCreate(getInstanceId());
+
+        if (mRootComp != null) {
+            mRootComp.onActivityCreate();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely,onActivityCreate can not be call!");
+        }
+
+        mGlobalEventReceiver = new WXGlobalEventReceiver(this);
+        getContext().registerReceiver(mGlobalEventReceiver, new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
+
+
+    }
+
+    public boolean onCreateOptionsMenu(Menu menu) {
+        WXModuleManager.onCreateOptionsMenu(getInstanceId(), menu);
+        if (mRootComp != null) {
+            mRootComp.onCreateOptionsMenu(menu);
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
+        }
+        return true;
+    }
+
+
+
+    @Override
+    public void onActivityStart() {
+
+        // module listen Activity onActivityCreate
+        WXModuleManager.onActivityStart(getInstanceId());
+        if (mRootComp != null) {
+            mRootComp.onActivityStart();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
+        }
+        WXLogUtils.i("Application onActivityStart()");
+    }
+
+    private AtomicBoolean currentGround = new AtomicBoolean(false);
+    @Override
+    public void onActivityResume() {
+        // notify onActivityResume callback to module
+        WXModuleManager.onActivityResume(getInstanceId());
+
+        if (mRootComp != null) {
+            mRootComp.onActivityResume();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
+        }
+        WXLogUtils.i("Application onActivityResume()");
+        if (currentGround.get()) {
+            WXLogUtils.i("Application  to be in the foreground");
+            Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+            intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
+            intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
+            currentGround.set(false);
+            mContext.sendBroadcast(intent);
+        }
+        onViewAppear();
+
+        setViewPortWidth(mInstanceViewPortWidth);
+    }
+
+
+    @Override
+    public void onActivityPause() {
+        onViewDisappear();
+        if (!isCommit) {
+            Set<String> componentTypes = WXComponentFactory.getComponentTypesByInstanceId(getInstanceId());
+            if (componentTypes != null && componentTypes.contains(WXBasicComponentType.SCROLLER)) {
+                mWXPerformance.useScroller = 1;
             }
-            if (mStatisticsListener != null) {
-              mStatisticsListener.onFirstView();
+            mWXPerformance.maxDeepViewLayer = getMaxDeepLayer();
+            if (mUserTrackAdapter != null) {
+                mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, mWXPerformance, getUserTrackParams());
             }
-          }
+            isCommit = true;
+        }
+        // module listen Activity onActivityPause
+        WXModuleManager.onActivityPause(getInstanceId());
+        if (mRootComp != null) {
+            mRootComp.onActivityPause();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely,onActivityPause can not be call!");
+        }
+        WXLogUtils.i("Application onActivityPause()");
+        if (!currentGround.get()) {
+            WXLogUtils.i("Application to be in the backround");
+            Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+            intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
+            intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
+            mContext.sendBroadcast(intent);
+            this.currentGround.set(true);
         }
-      });
     }
-  }
+    @Override
+    public void onActivityStop() {
+
+        // notify onActivityResume callback to module
+        WXModuleManager.onActivityStop(getInstanceId());
+
+        if (mRootComp != null) {
+            mRootComp.onActivityStop();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onActivityStop can not be call!");
+        }
+        WXLogUtils.i("Application onActivityStop()");
+
+    }
+
+    @Override
+    public void onActivityDestroy() {
+        WXModuleManager.onActivityDestroy(getInstanceId());
 
-  /**
-   * call back when update finish
-   */
-  public void onUpdateFinish() {
-    WXLogUtils.d("Instance onUpdateSuccess");
-  }
+        if (mRootComp != null) {
+            mRootComp.onActivityDestroy();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onActivityDestroy can not be call!");
+        }
 
+        destroy();
+    }
 
-  public void runOnUiThread(Runnable action) {
-    WXSDKManager.getInstance().postOnUiThread(action, 0);
-  }
+    @Override
+    public boolean onActivityBack() {
 
-  public void onRenderSuccess(final int width, final int height) {
-    firstScreenRenderFinished();
+        WXModuleManager.onActivityBack(getInstanceId());
 
-    long time = System.currentTimeMillis() - mRenderStartTime;
-    WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
-    WXLogUtils.renderPerformanceLog("   invokeCreateInstance",mWXPerformance.communicateTime);
-    WXLogUtils.renderPerformanceLog("   TotalCallNativeTime", mWXPerformance.callNativeTime);
-    WXLogUtils.renderPerformanceLog("       TotalJsonParseTime", mWXPerformance.parseJsonTime);
-    WXLogUtils.renderPerformanceLog("   TotalBatchTime", mWXPerformance.batchTime);
-    WXLogUtils.renderPerformanceLog("       TotalCssLayoutTime", mWXPerformance.cssLayoutTime);
-    WXLogUtils.renderPerformanceLog("       TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
-    WXLogUtils.renderPerformanceLog("       TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+        if (mRootComp != null) {
+            return mRootComp.onActivityBack();
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onActivityBack can not be call!");
+        }
 
+        return false;
+    }
 
-    mWXPerformance.totalTime = time;
-    if(mWXPerformance.screenRenderTime<0.001){
-      mWXPerformance.screenRenderTime =  time;
+    public boolean onBackPressed() {
+        WXComponent comp = getRootComponent();
+        if (comp != null) {
+            WXEvent events = comp.getDomObject().getEvents();
+            boolean hasBackPressed = events.contains(Constants.Event.CLICKBACKITEM);
+            if (hasBackPressed) {
+                WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.CLICKBACKITEM, null, null);
+            }
+            return hasBackPressed;
+        }
+        return false;
     }
-    mWXPerformance.componentCount = WXComponent.mComponentNum;
-    if(WXEnvironment.isApkDebugable()) {
-      WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, "mComponentNum:" + WXComponent.mComponentNum);
+
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        WXModuleManager.onActivityResult(getInstanceId(), requestCode, resultCode, data);
+
+        if (mRootComp != null) {
+            mRootComp.onActivityResult(requestCode, resultCode, data);
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onActivityResult can not be call!");
+        }
     }
-    WXComponent.mComponentNum = 0;
-    if (mRenderListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
 
-        @Override
-        public void run() {
-          if (mRenderListener != null && mContext != null) {
-            mRenderListener.onRenderSuccess(WXSDKInstance.this, width, height);
-            if (mUserTrackAdapter != null) {
-              WXPerformance performance=new WXPerformance();
-              performance.errCode=WXErrorCode.WX_SUCCESS.getErrorCode();
-              performance.args=getBundleUrl();
-              mUserTrackAdapter.commit(mContext,null,IWXUserTrackAdapter.JS_BRIDGE,performance,getUserTrackParams());
+
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+
+        WXModuleManager.onRequestPermissionsResult(getInstanceId(), requestCode, permissions, grantResults);
+
+        if (mRootComp != null) {
+            mRootComp.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        } else {
+            WXLogUtils.w("Warning :Component tree has not build completely, onRequestPermissionsResult can not be call!");
+        }
+    }
+
+    /********************************
+     *  end hook Activity life cycle callback
+     ********************************************************/
+
+    public void onViewDisappear() {
+        WXComponent comp = getRootComponent();
+        if (comp != null) {
+            WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWDISAPPEAR, null, null);
+            //call disappear of nested instances
+            for (OnInstanceVisibleListener instance : mVisibleListeners) {
+                instance.onDisappear();
             }
-            if (WXEnvironment.isApkDebugable()) {
-              WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, mWXPerformance.toString());
+        }
+    }
+
+    public void onViewAppear() {
+        WXComponent comp = getRootComponent();
+        if (comp != null) {
+            WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWAPPEAR, null, null);
+            for (OnInstanceVisibleListener instance : mVisibleListeners) {
+                instance.onAppear();
             }
-          }
         }
-      });
     }
-    if(!WXEnvironment.isApkDebugable()){
-      Log.e("weex_perf",mWXPerformance.getPerfData());
+
+
+    public void onCreateFinish() {
+        if (mContext != null) {
+            runOnUiThread(new Runnable() {
+
+                @Override
+                public void run() {
+                    if (mContext != null) {
+                        onViewAppear();
+                        View wxView = mRenderContainer;
+                        if (WXEnvironment.isApkDebugable() && WXSDKManager.getInstance().getIWXDebugAdapter() != null) {
+                            wxView = WXSDKManager.getInstance().getIWXDebugAdapter().wrapContainer(WXSDKInstance.this, wxView);
+                        }
+                        if (mRenderListener != null) {
+                            mRenderListener.onViewCreated(WXSDKInstance.this, wxView);
+                        }
+                        if (mStatisticsListener != null) {
+                            mStatisticsListener.onFirstView();
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * call back when update finish
+     */
+    public void onUpdateFinish() {
+        WXLogUtils.d("Instance onUpdateSuccess");
     }
-  }
 
-  public void onRefreshSuccess(final int width, final int height) {
-    WXLogUtils.renderPerformanceLog("onRefreshSuccess", (System.currentTimeMillis() - mRefreshStartTime));
-    if (mRenderListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
 
-        @Override
-        public void run() {
-          if (mRenderListener != null && mContext != null) {
-            mRenderListener.onRefreshSuccess(WXSDKInstance.this, width, height);
-          }
+    public void runOnUiThread(Runnable action) {
+        WXSDKManager.getInstance().postOnUiThread(action, 0);
+    }
+
+    public void onRenderSuccess(final int width, final int height) {
+        firstScreenRenderFinished();
+
+        long time = System.currentTimeMillis() - mRenderStartTime;
+        WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
+        WXLogUtils.renderPerformanceLog("   invokeCreateInstance", mWXPerformance.communicateTime);
+        WXLogUtils.renderPerformanceLog("   TotalCallNativeTime", mWXPerformance.callNativeTime);
+        WXLogUtils.renderPerformanceLog("       TotalJsonParseTime", mWXPerformance.parseJsonTime);
+        WXLogUtils.renderPerformanceLog("   TotalBatchTime", mWXPerformance.batchTime);
+        WXLogUtils.renderPerformanceLog("       TotalCssLayoutTime", mWXPerformance.cssLayoutTime);
+        WXLogUtils.renderPerformanceLog("       TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
+        WXLogUtils.renderPerformanceLog("       TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+
+
+        mWXPerformance.totalTime = time;
+        if (mWXPerformance.screenRenderTime < 0.001) {
+            mWXPerformance.screenRenderTime = time;
+        }
+        mWXPerformance.componentCount = WXComponent.mComponentNum;
+        if (WXEnvironment.isApkDebugable()) {
+            WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, "mComponentNum:" + WXComponent.mComponentNum);
+        }
+        WXComponent.mComponentNum = 0;
+        if (mRenderListener != null && mContext != null) {
+            runOnUiThread(new Runnable() {
+
+                @Override
+                public void run() {
+                    if (mRenderListener != null && mContext != null) {
+                        mRenderListener.onRenderSuccess(WXSDKInstance.this, width, height);
+                        if (mUserTrackAdapter != null) {
+                            WXPerformance performance = new WXPerformance();
+                            performance.errCode = WXErrorCode.WX_SUCCESS.getErrorCode();
+                            performance.args = getBundleUrl();
+                            mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.JS_BRIDGE, performance, getUserTrackParams());
+                        }
+                        if (WXEnvironment.isApkDebugable()) {
+                            WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, mWXPerformance.toString());
+                        }
+                    }
+                }
+            });
+        }
+        if (!WXEnvironment.isApkDebugable()) {
+            Log.e("weex_perf", mWXPerformance.getPerfData());
         }
-      });
     }
-  }
 
-  public void onRenderError(final String errCode, final String msg) {
-    if (mRenderListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
+    public void onRefreshSuccess(final int width, final int height) {
+        WXLogUtils.renderPerformanceLog("onRefreshSuccess", (System.currentTimeMillis() - mRefreshStartTime));
+        if (mRenderListener != null && mContext != null) {
+            runOnUiThread(new Runnable() {
 
-        @Override
-        public void run() {
-          if (mRenderListener != null && mContext != null) {
-            mRenderListener.onException(WXSDKInstance.this, errCode, msg);
-          }
+                @Override
+                public void run() {
+                    if (mRenderListener != null && mContext != null) {
+                        mRenderListener.onRefreshSuccess(WXSDKInstance.this, width, height);
+                    }
+                }
+            });
         }
-      });
     }
-  }
 
-  public void onJSException(final String errCode, final String function, final String exception) {
-    if (mRenderListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
+    public void onRenderError(final String errCode, final String msg) {
+        if (mRenderListener != null && mContext != null) {
+            runOnUiThread(new Runnable() {
 
-        @Override
-        public void run() {
-          if (mRenderListener != null && mContext != null) {
-            StringBuilder builder = new StringBuilder();
-            builder.append(function);
-            builder.append(exception);
-            mRenderListener.onException(WXSDKInstance.this, errCode, builder.toString());
-          }
+                @Override
+                public void run() {
+                    if (mRenderListener != null && mContext != null) {
+                        mRenderListener.onException(WXSDKInstance.this, errCode, msg);
+                    }
+                }
+            });
+        }
+    }
+
+    public void onJSException(final String errCode, final String function, final String exception) {
+        if (mRenderListener != null && mContext != null) {
+            runOnUiThread(new Runnable() {
+
+                @Override
+                public void run() {
+                    if (mRenderListener != null && mContext != null) {
+                        StringBuilder builder = new StringBuilder();
+                        builder.append(function);
+                        builder.append(exception);
+                        mRenderListener.onException(WXSDKInstance.this, errCode, builder.toString());
+                    }
+                }
+            });
         }
-      });
     }
-  }
 
 
-  @Override
-  public final void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
-      oldTop, int oldRight, int oldBottom) {
-    if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
-      onLayoutChange(v);
+    @Override
+    public final void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
+            oldTop, int oldRight, int oldBottom) {
+        if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
+            onLayoutChange(v);
+        }
     }
-  }
 
-  /**
-   * Subclass should override this method to get notifications of layout change of GodView.
-   * @param godView the godView.
-   */
-  public void onLayoutChange(View godView) {
+    /**
+     * Subclass should override this method to get notifications of layout change of GodView.
+     *
+     * @param godView the godView.
+     */
+    public void onLayoutChange(View godView) {
+
+    }
 
-  }
+    private boolean mCreateInstance = true;
 
-  private boolean mCreateInstance =true;
-  public void firstScreenCreateInstanceTime(long time) {
-    if(mCreateInstance) {
-      mWXPerformance.firstScreenJSFExecuteTime = time -mRenderStartTime;
-      mCreateInstance =false;
+    public void firstScreenCreateInstanceTime(long time) {
+        if (mCreateInstance) {
+            mWXPerformance.firstScreenJSFExecuteTime = time - mRenderStartTime;
+            mCreateInstance = false;
+        }
     }
-  }
 
-  public void callNativeTime(long time) {
-    mWXPerformance.callNativeTime += time;
-  }
+    public void callNativeTime(long time) {
+        mWXPerformance.callNativeTime += time;
+    }
 
-  public void jsonParseTime(long time) {
-    mWXPerformance.parseJsonTime += time;
-  }
+    public void jsonParseTime(long time) {
+        mWXPerformance.parseJsonTime += time;
+    }
 
-  public void firstScreenRenderFinished() {
-    if(mEnd == true)
-       return;
+    public void firstScreenRenderFinished() {
+        if (mEnd == true)
+            return;
 
-    mEnd = true;
+        mEnd = true;
 
-    if (mStatisticsListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
-        @Override
-        public void run() {
-          if (mStatisticsListener != null && mContext != null) {
-            Trace.beginSection("onFirstScreen");
-            mStatisticsListener.onFirstScreen();
-            Trace.endSection();
-          }
-        }
-      });
-    }
-
-    mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
-    WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", mWXPerformance.callNativeTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenJsonParseTime", mWXPerformance.parseJsonTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenBatchTime", mWXPerformance.batchTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenCssLayoutTime", mWXPerformance.cssLayoutTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
-  }
+        if (mStatisticsListener != null && mContext != null) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if (mStatisticsListener != null && mContext != null) {
+                        Trace.beginSection("onFirstScreen");
+                        mStatisticsListener.onFirstScreen();
+                        Trace.endSection();
+                    }
+                }
+            });
+        }
 
-  public void batchTime(long time) {
-    mWXPerformance.batchTime += time;
-  }
-  public void cssLayoutTime(long time) {
-      mWXPerformance.cssLayoutTime += time;
-  }
-
-  public void applyUpdateTime(long time) {
-      mWXPerformance.applyUpdateTime += time;
-  }
-
-  public void updateDomObjTime(long time) {
-      mWXPerformance.updateDomObjTime += time;
-    }
-
-
-  public void createInstanceFinished(long time) {
-    if (time > 0) {
-      mWXPerformance.communicateTime = time;
-    }
-  }
-
-  /**
-   * UserTrack Log
-   */
-  public void commitUTStab(final String type, final WXErrorCode errorCode) {
-    if (TextUtils.isEmpty(type) || errorCode == null) {
-      return;
-    }
-
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        // Record exception if a render error happened.
-        if (mStatisticsListener != null && errorCode != WXErrorCode.WX_SUCCESS) {
-          mStatisticsListener.onException(mInstanceId,
-                                          errorCode.getErrorCode(),
-                                          errorCode.getErrorMsg());
-        }
-
-        WXPerformance performance = new WXPerformance();
-        performance.errCode = errorCode.getErrorCode();
-        performance.args = errorCode.getArgs();
-        if (errorCode != WXErrorCode.WX_SUCCESS) {
-          performance.errMsg = errorCode.getErrorMsg();
-          if (WXEnvironment.isApkDebugable()) {
-            WXLogUtils.d(performance.toString());
-          }
-        }
-        if( mUserTrackAdapter!= null) {
-          mUserTrackAdapter.commit(mContext, null, type, performance, getUserTrackParams());
-        }
-      }
-    });
-  }
-
-  private void destroyView(View rootView) {
-    try {
-      if (rootView instanceof ViewGroup) {
-        ViewGroup cViewGroup = ((ViewGroup) rootView);
-        for (int index = 0; index < cViewGroup.getChildCount(); index++) {
-          destroyView(cViewGroup.getChildAt(index));
-        }
-
-        cViewGroup.removeViews(0, ((ViewGroup) rootView).getChildCount());
-        // Ensure that the viewgroup's status to be normal
-        WXReflectionUtils.setValue(rootView, "mChildrenCount", 0);
-
-      }
-      if(rootView instanceof Destroyable){
-        ((Destroyable)rootView).destroy();
-      }
-    } catch (Exception e) {
-      WXLogUtils.e("WXSDKInstance destroyView Exception: ", e);
-    }
-  }
-
-  public synchronized void destroy() {
-    WXSDKManager.getInstance().destroyInstance(mInstanceId);
-    WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
-
-    if(mGlobalEventReceiver!=null){
-      getContext().unregisterReceiver(mGlobalEventReceiver);
-      mGlobalEventReceiver=null;
-    }
-    if(mRootComp != null ) {
-      mRootComp.destroy();
-      destroyView(mRenderContainer);
-      mRenderContainer = null;
-      mRootComp = null;
-    }
-
-    if(mGlobalEvents!=null){
-      mGlobalEvents.clear();
-    }
-
-
-    mNestedInstanceInterceptor = null;
-    mUserTrackAdapter = null;
-    mScrollView = null;
-    mContext = null;
-    mRenderListener = null;
-    isDestroy = true;
-    mStatisticsListener = null;
-  }
-
-  public boolean isDestroy(){
-    return isDestroy;
-  }
-
-  /**
-   * @return If you use render () the return value may be empty
-   */
-  public @Nullable String getBundleUrl() {
-    return mBundleUrl;
-  }
-
-  public View getRootView() {
-    return mRootComp.getRealView();
-  }
-
-  public View getContainerView() {
-    return mRenderContainer;
-  }
-
-  @Deprecated
-  public void setBundleUrl(String url){
-    mBundleUrl = url;
-    if(WXSDKManager.getInstance().getValidateProcessor()!=null) {
-      mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
-    }
-  }
-
-  public void onRootCreated(WXComponent root) {
-    this.mRootComp = root;
-    mRenderContainer.addView(root.getHostView());
-    setSize(mRenderContainer.getWidth(),mRenderContainer.getHeight());
-  }
-
-  /**
-   * Move fixed view to container ,except it's already moved.
-   * @param fixedChild
-   */
-  public void moveFixedView(View fixedChild){
-    if(mRenderContainer != null) {
-      ViewGroup parent;
-      if((parent = (ViewGroup) fixedChild.getParent()) != null){
-        if (parent != mRenderContainer) {
-          parent.removeView(fixedChild);
-          mRenderContainer.addView(fixedChild);
-        }
-      }else{
-        mRenderContainer.addView(fixedChild);
-      }
-    }
-  }
-
-  public void removeFixedView(View fixedChild){
-    if(mRenderContainer != null) {
-      mRenderContainer.removeView(fixedChild);
-    }
-  }
-
-  public synchronized List<OnWXScrollListener> getWXScrollListeners() {
-    return mWXScrollListeners;
-  }
-
-  public synchronized void registerOnWXScrollListener(OnWXScrollListener wxScrollListener) {
-    if(mWXScrollListeners==null){
-      mWXScrollListeners=new ArrayList<>();
-    }
-    mWXScrollListeners.add(wxScrollListener);
-  }
-
-  private void updateRootComponentStyle(JSONObject style) {
-    Message message = Message.obtain();
-    WXDomTask task = new WXDomTask();
-    task.instanceId = getInstanceId();
-    if (task.args == null) {
-      task.args = new ArrayList<>();
-    }
-    task.args.add(WXDomObject.ROOT);
-    task.args.add(style);
-    message.obj = task;
-    message.what = WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE;
-    WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
-  }
-
-  public void setSize(int width, int height) {
-    if (width < 0 || height < 0 || isDestroy || !mRendered) {
-      return;
-    }
-    float realWidth = WXViewUtils.getWebPxByWidth(width,getInstanceViewPortWidth());
-    float realHeight = WXViewUtils.getWebPxByWidth(height,getInstanceViewPortWidth());
-
-    View godView = mRenderContainer;
-    if (godView != null) {
-      ViewGroup.LayoutParams layoutParams = godView.getLayoutParams();
-      if (layoutParams != null) {
-        if(godView.getWidth() != width || godView.getHeight() != height) {
-          layoutParams.width = width;
-          layoutParams.height = height;
-          godView.setLayoutParams(layoutParams);
-        }
-
-        JSONObject style = new JSONObject();
-        WXComponent rootComponent = mRootComp;
-
-        if(rootComponent == null){
-          return;
-        }
-        style.put(Constants.Name.DEFAULT_WIDTH, realWidth);
-        style.put(Constants.Name.DEFAULT_HEIGHT, realHeight);
-        updateRootComponentStyle(style);
-      }
-    }
-  }
-
-  /*Global Event*/
-  private HashMap<String, List<String>> mGlobalEvents = new HashMap<>();
-
-  public void fireGlobalEventCallback(String eventName, Map<String,Object> params){
-    List<String> callbacks=mGlobalEvents.get(eventName);
-    if(callbacks!=null){
-      for(String callback:callbacks){
-        WXSDKManager.getInstance().callback(mInstanceId,callback,params,true);
-      }
-    }
-  }
-
-  /**
-   * Fire event callback on a element.
-   * @param elementRef
-   * @param type
-   * @param data
-   * @param domChanges
-   */
-  public void fireEvent(String elementRef,final String type, final Map<String, Object> data,final Map<String, Object> domChanges){
-    WXBridgeManager.getInstance().fireEventOnNode(getInstanceId(),elementRef,type,data,domChanges);
-  }
-
-  public void fireEvent(String elementRef,final String type, final Map<String, Object> data){
-    fireEvent(elementRef,type,data,null);
-  }
-
-  public void fireEvent(String ref, String type){
-    fireEvent(ref,type,new HashMap<String, Object>());
-  }
-
-  protected void addEventListener(String eventName, String callback) {
-    if (TextUtils.isEmpty(eventName) || TextUtils.isEmpty(callback)) {
-      return;
-    }
-    List<String> callbacks = mGlobalEvents.get(eventName);
-    if (callbacks == null) {
-      callbacks = new ArrayList<>();
-      mGlobalEvents.put(eventName, callbacks);
-    }
-    callbacks.add(callback);
-  }
-  protected void removeEventListener(String eventName, String callback) {
-    if (TextUtils.isEmpty(eventName) || TextUtils.isEmpty(callback)) {
-      return;
-    }
-    List<String> callbacks = mGlobalEvents.get(eventName);
-    if (callbacks != null) {
-      callbacks.remove(callback);
-    }
-  }
-
-  protected void removeEventListener(String eventName) {
-    if (TextUtils.isEmpty(eventName)) {
-      return;
-    }
-    mGlobalEvents.remove(eventName);
-  }
-
-  /**
-   * Notifies WEEX that this event has occurred
-   * @param eventName WEEX register event
-   * @param module Events occur in this Module
-   * @param params The parameters to be notified to WEEX are required
-   */
-  public void fireModuleEvent(String eventName, WXModule module,Map<String, Object> params) {
-    if (TextUtils.isEmpty(eventName) || module == null) {
-      return;
-    }
-
-    Map<String, Object> event = new HashMap<>();
-    event.put("type", eventName);
-    event.put("module", module.getModuleName());
-    event.put("data", params);
-
-    List<String> callbacks = module.getEventCallbacks(eventName);
-    if (callbacks != null) {
-      for (String callback : callbacks) {
-        SimpleJSCallback jsCallback = new SimpleJSCallback(mInstanceId, callback);
-        if (module.isOnce(callback)) {
-          jsCallback.invoke(event);
-        } else {
-          jsCallback.invokeAndKeepAlive(event);
-        }
-      }
-    }
-  }
-
-  /**
-   * Check whether the current module registered the event
-   * @param eventName EventName register in weex
-   * @param module Events occur in this Module
-   * @return  register->true
-   */
-  public boolean checkModuleEventRegistered(String eventName,WXModule module) {
-    if (module != null) {
-      List<String> events = module.getEventCallbacks(eventName);
-      if (events != null && events.size() > 0) {
-        return true;
-      }
+        mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
+        WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
+        WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
+        WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", mWXPerformance.callNativeTime);
+        WXLogUtils.renderPerformanceLog("       firstScreenJsonParseTime", mWXPerformance.parseJsonTime);
+        WXLogUtils.renderPerformanceLog("   firstScreenBatchTime", mWXPerformance.batchTime);
+        WXLogUtils.renderPerformanceLog("       firstScreenCssLayoutTime", mWXPerformance.cssLayoutTime);
+        WXLogUtils.renderPerformanceLog("       firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
+        WXLogUtils.renderPerformanceLog("       firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
     }
-    return false;
-  }
 
-  public WXPerformance getWXPerformance(){
-    return mWXPerformance;
-  }
+    public void batchTime(long time) {
+        mWXPerformance.batchTime += time;
+    }
 
-  public Map<String, Serializable> getUserTrackParams() {
-    return mUserTrackParams;
-  }
+    public void cssLayoutTime(long time) {
+        mWXPerformance.cssLayoutTime += time;
+    }
 
-  public void addUserTrackParameter(String key,Serializable value){
-    if(this.mUserTrackParams == null){
-      this.mUserTrackParams = new ConcurrentHashMap<>();
+    public void applyUpdateTime(long time) {
+        mWXPerformance.applyUpdateTime += time;
     }
-    mUserTrackParams.put(key,value);
-  }
 
-  public void clearUserTrackParameters(){
-    if(this.mUserTrackParams != null){
-      this.mUserTrackParams.clear();
+    public void updateDomObjTime(long time) {
+        mWXPerformance.updateDomObjTime += time;
     }
-  }
 
-  public void removeUserTrackParameter(String key){
-    if(this.mUserTrackParams != null){
-      this.mUserTrackParams.remove(key);
+
+    public void createInstanceFinished(long time) {
+        if (time > 0) {
+            mWXPerformance.communicateTime = time;
+        }
     }
-  }
 
-  public int getMaxDeepLayer() {
-    return mMaxDeepLayer;
-  }
+    /**
+     * UserTrack Log
+     */
+    public void commitUTStab(final String type, final WXErrorCode errorCode) {
+        if (TextUtils.isEmpty(type) || errorCode == null) {
+            return;
+        }
 
-  public void setMaxDeepLayer(int maxDeepLayer) {
-    mMaxDeepLayer = maxDeepLayer;
-  }
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // Record exception if a render error happened.
+                if (mStatisticsListener != null && errorCode != WXErrorCode.WX_SUCCESS) {
+                    mStatisticsListener.onException(mInstanceId,
+                            errorCode.getErrorCode(),
+                            errorCode.getErrorMsg());
+                }
+
+                WXPerformance performance = new WXPerformance();
+                performance.errCode = errorCode.getErrorCode();
+                performance.args = errorCode.getArgs();
+                if (errorCode != WXErrorCode.WX_SUCCESS) {
+                    performance.errMsg = errorCode.getErrorMsg();
+                    if (WXEnvironment.isApkDebugable()) {
+                        WXLogUtils.d(performance.toString());
+                    }
+                }
+                if (mUserTrackAdapter != null) {
+                    mUserTrackAdapter.commit(mContext, null, type, performance, getUserTrackParams());
+                }
+            }
+        });
+    }
 
-  /**
-   * load bundle js listener
-   */
-  class WXHttpListener implements IWXHttpAdapter.OnHttpListener {
+    private void destroyView(View rootView) {
+        try {
+            if (rootView instanceof ViewGroup) {
+                ViewGroup cViewGroup = ((ViewGroup) rootView);
+                for (int index = 0; index < cViewGroup.getChildCount(); index++) {
+                    destroyView(cViewGroup.getChildAt(index));
+                }
 
-    private String pageName;
-    private Map<String, Object> options;
-    private String jsonInitData;
-    private WXRenderStrategy flag;
-    private WXSDKInstance instance;
-    private long startRequestTime;
+                cViewGroup.removeViews(0, ((ViewGroup) rootView).getChildCount());
+                // Ensure that the viewgroup's status to be normal
+                WXReflectionUtils.setValue(rootView, "mChildrenCount", 0);
 
-    private WXHttpListener(String pageName, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag, long startRequestTime) {
-      this.pageName = pageName;
-      this.options = options;
-      this.jsonInitData = jsonInitData;
-      this.flag = flag;
-      this.startRequestTime = startRequestTime;
+            }
+            if (rootView instanceof Destroyable) {
+                ((Destroyable) rootView).destroy();
+            }
+        } catch (Exception e) {
+            WXLogUtils.e("WXSDKInstance destroyView Exception: ", e);
+        }
     }
-    
-    public void setSDKInstance(WXSDKInstance instance) {
-      this.instance = instance;
+
+    public synchronized void destroy() {
+        WXSDKManager.getInstance().destroyInstance(mInstanceId);
+        WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
+
+        if (mGlobalEventReceiver != null) {
+            getContext().unregisterReceiver(mGlobalEventReceiver);
+            mGlobalEventReceiver = null;
+        }
+        if (mRootComp != null) {
+            mRootComp.destroy();
+            destroyView(mRenderContainer);
+            mRenderContainer = null;
+            mRootComp = null;
+        }
+
+        if (mGlobalEvents != null) {
+            mGlobalEvents.clear();
+        }
+
+
+        mNestedInstanceInterceptor = null;
+        mUserTrackAdapter = null;
+        mScrollView = null;
+        mContext = null;
+        mRenderListener = null;
+        isDestroy = true;
+        mStatisticsListener = null;
     }
 
-    @Override
-    public void onHttpStart() {
-      if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
-        this.instance.getWXStatisticsListener().onHttpStart();
-      }
+    public boolean isDestroy() {
+        return isDestroy;
     }
 
-    @Override
-    public void onHeadersReceived(int statusCode,Map<String,List<String>> headers) {
-      if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
-        this.instance.getWXStatisticsListener().onHeadersReceived();
-      }
+    /**
+     * @return If you use render () the return value may be empty
+     */
+    public
+    @Nullable
+    String getBundleUrl() {
+        return mBundleUrl;
     }
 
-    @Override
-    public void onHttpUploadProgress(int uploadProgress) {
+    public View getRootView() {
+        return mRootComp.getRealView();
+    }
 
+    public View getContainerView() {
+        return mRenderContainer;
     }
 
-    @Override
-    public void onHttpResponseProgress(int loadedLength) {
+    @Deprecated
+    public void setBundleUrl(String url) {
+        mBundleUrl = url;
+        if (WXSDKManager.getInstance().getValidateProcessor() != null) {
+            mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
+        }
+    }
+
+    public void onRootCreated(WXComponent root) {
+        this.mRootComp = root;
+        mRenderContainer.addView(root.getHostView());
+        setSize(mRenderContainer.getWidth(), mRenderContainer.getHeight());
+    }
+
+    /**
+     * Move fixed view to container ,except it's already moved.
+     *
+     * @param fixedChild
+     */
+    public void moveFixedView(View fixedChild) {
+        if (mRenderContainer != null) {
+            ViewGroup parent;
+            if ((parent = (ViewGroup) fixedChild.getParent()) != null) {
+                if (parent != mRenderContainer) {
+                    parent.removeView(fixedChild);
+                    mRenderContainer.addView(fixedChild);
+                }
+            } else {
+                mRenderContainer.addView(fixedChild);
+            }
+        }
+    }
 
+    public void removeFixedView(View fixedChild) {
+        if (mRenderContainer != null) {
+            mRenderContainer.removeView(fixedChild);
+        }
     }
 
-    @Override
-    public void onHttpFinish(WXResponse response) {
-      if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
-        this.instance.getWXStatisticsListener().onHttpFinish();
-      }
+    public synchronized List<OnWXScrollListener> getWXScrollListeners() {
+        return mWXScrollListeners;
+    }
+
+    public synchronized void registerOnWXScrollListener(OnWXScrollListener wxScrollListener) {
+        if (mWXScrollListeners == null) {
+            mWXScrollListeners = new ArrayList<>();
+        }
+        mWXScrollListeners.add(wxScrollListener);
+    }
+
+    private void updateRootComponentStyle(JSONObject style) {
+        Message message = Message.obtain();
+        WXDomTask task = new WXDomTask();
+        task.instanceId = getInstanceId();
+        if (task.args == null) {
+            task.args = new ArrayList<>();
+        }
+        task.args.add(WXDomObject.ROOT);
+        task.args.ad

<TRUNCATED>


[8/8] incubator-weex git commit: Merge branch '0.14-dev' of http://github.com/homeblog/incubator-weex into 0.14-dev

Posted by so...@apache.org.
Merge branch '0.14-dev' of http://github.com/homeblog/incubator-weex into 0.14-dev


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/38b29900
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/38b29900
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/38b29900

Branch: refs/heads/0.14-dev
Commit: 38b29900ffcadbcb480b36aa4105f36aef0f5adf
Parents: 63e0f45 ff9c4a8
Author: sospartan <so...@apache.org>
Authored: Thu Jun 15 15:17:21 2017 +0800
Committer: sospartan <so...@apache.org>
Committed: Thu Jun 15 15:17:21 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     | 27 ++++++++++++++------
 1 file changed, 19 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[6/8] incubator-weex git commit: add variable name prefix ‘m’

Posted by so...@apache.org.
add  variable name prefix ‘m’


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/7ffe22c5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/7ffe22c5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/7ffe22c5

Branch: refs/heads/0.14-dev
Commit: 7ffe22c5696be8a24347c339d5a2af11efc4c613
Parents: 37f05fe
Author: hao.haoh <ha...@taobao.com>
Authored: Thu Jun 15 14:50:06 2017 +0800
Committer: hao.haoh <ha...@taobao.com>
Committed: Thu Jun 15 14:50:06 2017 +0800

----------------------------------------------------------------------
 .../sdk/src/main/java/com/taobao/weex/WXSDKInstance.java | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7ffe22c5/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index d849c31..b101b30 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -142,6 +142,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
   private LayoutFinishListener mLayoutFinishListener;
 
+  private AtomicBoolean mCurrentGround = new AtomicBoolean(false);
 
   /**
    * If anchor is created manually(etc. define a layout xml resource ),
@@ -738,7 +739,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
     return true;
   }
-  private AtomicBoolean currentGround = new AtomicBoolean(false);
+
 
   @Override
   public void onActivityPause() {
@@ -763,13 +764,13 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
 
     WXLogUtils.i("Application onActivityPause()");
-    if (!currentGround.get()) {
+    if (!mCurrentGround.get()) {
       WXLogUtils.i("Application to be in the backround");
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
       mContext.sendBroadcast(intent);
-      this.currentGround.set(true);
+      this.mCurrentGround.set(true);
     }
   }
 
@@ -786,13 +787,13 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
     }
 
-    if (currentGround.get()) {
+    if (mCurrentGround.get()) {
       WXLogUtils.i("Application  to be in the foreground");
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
-      currentGround.set(false);
       mContext.sendBroadcast(intent);
+      mCurrentGround.set(false);
     }
 
     onViewAppear();


[4/8] incubator-weex git commit: Revert "modify activity event"

Posted by so...@apache.org.
Revert "modify activity event"

This reverts commit 8c705e9aa602be0316939d0ff1f658126d30abf2.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/56b18409
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/56b18409
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/56b18409

Branch: refs/heads/0.14-dev
Commit: 56b18409b75bf935334210d315b35d8451b836fd
Parents: 8c705e9
Author: hao.haoh <ha...@taobao.com>
Authored: Thu Jun 15 14:31:17 2017 +0800
Committer: hao.haoh <ha...@taobao.com>
Committed: Thu Jun 15 14:31:17 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     | 2675 +++++++++---------
 1 file changed, 1316 insertions(+), 1359 deletions(-)
----------------------------------------------------------------------



[2/8] incubator-weex git commit: modify activity event

Posted by so...@apache.org.
modify activity event


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/8c705e9a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/8c705e9a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/8c705e9a

Branch: refs/heads/0.14-dev
Commit: 8c705e9aa602be0316939d0ff1f658126d30abf2
Parents: 202c180
Author: hao.haoh <ha...@taobao.com>
Authored: Mon Jun 12 14:58:18 2017 +0800
Committer: hao.haoh <ha...@taobao.com>
Committed: Mon Jun 12 14:58:18 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     | 2675 +++++++++---------
 1 file changed, 1359 insertions(+), 1316 deletions(-)
----------------------------------------------------------------------



[7/8] incubator-weex git commit: modify mCurrentGround boolean

Posted by so...@apache.org.
modify mCurrentGround  boolean


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ff9c4a8e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ff9c4a8e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ff9c4a8e

Branch: refs/heads/0.14-dev
Commit: ff9c4a8ee5b02b055d03fb713ab97615e60e440a
Parents: 7ffe22c
Author: hao.haoh <ha...@taobao.com>
Authored: Thu Jun 15 14:57:04 2017 +0800
Committer: hao.haoh <ha...@taobao.com>
Committed: Thu Jun 15 14:57:04 2017 +0800

----------------------------------------------------------------------
 .../sdk/src/main/java/com/taobao/weex/WXSDKInstance.java | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ff9c4a8e/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index b101b30..5533843 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -81,7 +81,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
 
@@ -142,7 +141,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
   private LayoutFinishListener mLayoutFinishListener;
 
-  private AtomicBoolean mCurrentGround = new AtomicBoolean(false);
+  private boolean mCurrentGround = false;
 
   /**
    * If anchor is created manually(etc. define a layout xml resource ),
@@ -764,13 +763,13 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
 
     WXLogUtils.i("Application onActivityPause()");
-    if (!mCurrentGround.get()) {
+    if (!mCurrentGround) {
       WXLogUtils.i("Application to be in the backround");
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
       mContext.sendBroadcast(intent);
-      this.mCurrentGround.set(true);
+      this.mCurrentGround = true;
     }
   }
 
@@ -787,13 +786,13 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
     }
 
-    if (mCurrentGround.get()) {
+    if (mCurrentGround) {
       WXLogUtils.i("Application  to be in the foreground");
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
       mContext.sendBroadcast(intent);
-      mCurrentGround.set(false);
+      mCurrentGround = false;
     }
 
     onViewAppear();


[3/8] incubator-weex git commit: Revert "modify activity event"

Posted by so...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/56b18409/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 6eaac07..2db6fb3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -18,7 +18,6 @@
  */
 package com.taobao.weex;
 
-import android.app.ActivityManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -82,7 +81,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
 
@@ -91,1519 +89,1478 @@ import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
  * Each instance of WXSDKInstance represents an running weex instance.
  * It can be a pure weex view, or mixed with native view
  */
-public class WXSDKInstance implements IWXActivityStateListener, DomContext, View.OnLayoutChangeListener {
-
-    //Performance
-    public boolean mEnd = false;
-    public static final String BUNDLE_URL = "bundleUrl";
-    private IWXUserTrackAdapter mUserTrackAdapter;
-    private IWXRenderListener mRenderListener;
-    private IWXStatisticsListener mStatisticsListener;
-    /**
-     * package
-     **/
-    Context mContext;
-    private final String mInstanceId;
-    private RenderContainer mRenderContainer;
-    private WXComponent mRootComp;
-    private boolean mRendered;
-    private WXRefreshData mLastRefreshData;
-    private NestedInstanceInterceptor mNestedInstanceInterceptor;
-    private String mBundleUrl = "";
-    private boolean isDestroy = false;
-    private Map<String, Serializable> mUserTrackParams;
-    private NativeInvokeHelper mNativeInvokeHelper;
-    private boolean isCommit = false;
-    private WXGlobalEventReceiver mGlobalEventReceiver = null;
-    private boolean trackComponent;
-    private boolean enableLayerType = true;
-    private boolean mNeedValidate = false;
-    private static volatile int mViewPortWidth = 750;
-    private int mInstanceViewPortWidth = 750;
-
-    /**
-     * Render strategy.
-     */
-    private WXRenderStrategy mRenderStrategy = WXRenderStrategy.APPEND_ASYNC;
-    /**
-     * Render start time
-     */
-    private long mRenderStartTime;
-    /**
-     * Refresh start time
-     */
-    private long mRefreshStartTime;
-    private WXPerformance mWXPerformance;
-    private ScrollView mScrollView;
-    private WXScrollViewListener mWXScrollViewListener;
-
-    private List<OnWXScrollListener> mWXScrollListeners;
-
-    /**
-     * whether we are in preRender mode
-     */
-    private volatile boolean isPreRenderMode;
-
-    private LayoutFinishListener mLayoutFinishListener;
-
-
-    /**
-     * If anchor is created manually(etc. define a layout xml resource ),
-     * be aware do not add it to twice when {@link IWXRenderListener#onViewCreated(WXSDKInstance, View)}.
-     *
-     * @param a
-     */
-    public void setRenderContainer(RenderContainer a) {
-        if (a != null) {
-            a.setSDKInstance(this);
-            a.addOnLayoutChangeListener(this);
-        }
-        mRenderContainer = a;
-    }
+public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.OnLayoutChangeListener {
+
+  //Performance
+  public boolean mEnd = false;
+  public static final String BUNDLE_URL = "bundleUrl";
+  private IWXUserTrackAdapter mUserTrackAdapter;
+  private IWXRenderListener mRenderListener;
+  private IWXStatisticsListener mStatisticsListener;
+  /** package **/ Context mContext;
+  private final String mInstanceId;
+  private RenderContainer mRenderContainer;
+  private WXComponent mRootComp;
+  private boolean mRendered;
+  private WXRefreshData mLastRefreshData;
+  private NestedInstanceInterceptor mNestedInstanceInterceptor;
+  private String mBundleUrl = "";
+  private boolean isDestroy=false;
+  private Map<String,Serializable> mUserTrackParams;
+  private NativeInvokeHelper mNativeInvokeHelper;
+  private boolean isCommit=false;
+  private WXGlobalEventReceiver mGlobalEventReceiver=null;
+  private boolean trackComponent;
+  private boolean enableLayerType = true;
+  private boolean mNeedValidate = false;
+  private static volatile int mViewPortWidth = 750;
+  private int mInstanceViewPortWidth = 750;
+
+  /**
+   * Render strategy.
+   */
+  private WXRenderStrategy mRenderStrategy = WXRenderStrategy.APPEND_ASYNC;
+  /**
+   * Render start time
+   */
+  private long mRenderStartTime;
+  /**
+   * Refresh start time
+   */
+  private long mRefreshStartTime;
+  private WXPerformance mWXPerformance;
+  private ScrollView mScrollView;
+  private WXScrollViewListener mWXScrollViewListener;
+
+  private List<OnWXScrollListener> mWXScrollListeners;
+
+  /**
+   * whether we are in preRender mode
+   * */
+  private volatile boolean isPreRenderMode;
+
+  private LayoutFinishListener mLayoutFinishListener;
+
+
+  /**
+   * If anchor is created manually(etc. define a layout xml resource ),
+   * be aware do not add it to twice when {@link IWXRenderListener#onViewCreated(WXSDKInstance, View)}.
+   * @param a
+   */
+  public void setRenderContainer(RenderContainer a){
+    if(a != null) {
+      a.setSDKInstance(this);
+      a.addOnLayoutChangeListener(this);
+    }
+    mRenderContainer = a;
+  }
+
+
+
+  private int mMaxDeepLayer;
+
+  public boolean isTrackComponent() {
+    return trackComponent;
+  }
+
+  public void setTrackComponent(boolean trackComponent) {
+    this.trackComponent = trackComponent;
+  }
+
+  /**
+   * Tell whether it is enabled to change the layerType
+   * {@link android.view.View#setLayerType(int, Paint)}
+   * @return True for enable to change the layerType of component, false otherwise. The default
+   * is True
+   */
+  public boolean isLayerTypeEnabled() {
+    return enableLayerType;
+  }
+
+  /**
+   * Enable the ability of changing layerType. e.g. {@link android.view.View#setLayerType(int, Paint)}
+   * Disable the ability of changing layerType will have tremendous <strong>performance
+   * punishment</strong>.
+   *
+   * <strong>Do not</strong> set this to false unless you know exactly what you are doing.
+   * @param enable True for enable to change the layerType of component, false otherwise. The default
+   * is True
+   */
+  public void enableLayerType(boolean enable) {
+    enableLayerType = enable;
+  }
+
+  public boolean isNeedValidate() {
+    return mNeedValidate;
+  }
+
+  /*
+  *  Warning: use setInstanceViewPortWidth instead.
+  *  store custom ViewPort Width
+  */
+  @Deprecated
+  public void setViewPortWidth(int viewPortWidth) {
+    mViewPortWidth = viewPortWidth;
+  }
+
+  /**
+   * Warning: use getInstanceViewPortWidth instead.
+   * @return
+   */
+  @Deprecated
+  public static int getViewPortWidth() {
+    return mViewPortWidth;
+  }
+
+  public void setInstanceViewPortWidth(int instanceViewPortWidth) {
+    this.mInstanceViewPortWidth = instanceViewPortWidth;
+  }
+
+  public int getInstanceViewPortWidth(){
+    return mInstanceViewPortWidth;
+  }
+
+  public interface OnInstanceVisibleListener{
+    void onAppear();
+    void onDisappear();
+  }
+  private List<OnInstanceVisibleListener> mVisibleListeners = new ArrayList<>();
+
+  public WXSDKInstance(Context context) {
+    mInstanceId = WXSDKManager.getInstance().generateInstanceId();
+    init(context);
+  }
+
+  /**
+   * For unittest only.
+   */
+  WXSDKInstance(Context context,String id) {
+    mInstanceId = id;
+    init(context);
+  }
+
+
+  public WXComponent getRootComponent() {
+    return mRootComp;
+  }
+
+  public void setNestedInstanceInterceptor(NestedInstanceInterceptor interceptor){
+    mNestedInstanceInterceptor = interceptor;
+  }
+
+  public WXSDKInstance createNestedInstance(NestedContainer container){
+    WXSDKInstance sdkInstance = new WXSDKInstance(mContext);
+    if(mNestedInstanceInterceptor != null){
+      mNestedInstanceInterceptor.onCreateNestInstance(sdkInstance,container);
+    }
+    return sdkInstance;
+  }
+
+  public void addOnInstanceVisibleListener(OnInstanceVisibleListener l){
+    mVisibleListeners.add(l);
+  }
+
+  public void removeOnInstanceVisibleListener(OnInstanceVisibleListener l){
+    mVisibleListeners.remove(l);
+  }
+
+  public void init(Context context) {
+    mContext = context;
+    mNativeInvokeHelper = new NativeInvokeHelper(mInstanceId);
+
+    mWXPerformance = new WXPerformance();
+    mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
+    mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
+
+    mUserTrackAdapter=WXSDKManager.getInstance().getIWXUserTrackAdapter();
+  }
+
+  public NativeInvokeHelper getNativeInvokeHelper() {
+    return mNativeInvokeHelper;
+  }
+
+  public void setBizType(String bizType) {
+    if (!TextUtils.isEmpty(bizType)) {
+      mWXPerformance.bizType = bizType;
+    }
+  }
+
+  public ScrollView getScrollView() {
+    return mScrollView;
+  }
+
+  public void setRootScrollView(ScrollView scrollView) {
+    mScrollView = scrollView;
+    if (mWXScrollViewListener != null) {
+      ((WXScrollView) mScrollView).addScrollViewListener(mWXScrollViewListener);
+    }
+  }
+
+  @Deprecated
+  public void registerScrollViewListener(WXScrollViewListener scrollViewListener) {
+    mWXScrollViewListener = scrollViewListener;
+  }
+
+  @Deprecated
+  public WXScrollViewListener getScrollViewListener() {
+    return mWXScrollViewListener;
+  }
+
+  @Deprecated
+  public void setIWXUserTrackAdapter(IWXUserTrackAdapter adapter) {
+  }
+
+  /**
+   * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
+   * @param template bundle js
+   * @param options  os   iphone/android/ipad
+   *                 weexversion    Weex version(like 1.0.0)
+   *                 appversion     App version(like 1.0.0)
+   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+   *                 Time    UNIX timestamp, UTC+08:00
+   *                 TTID(Optional)
+   *                 MarkertId
+   *                 Appname(Optional)  tm,tb,qa
+   *                 Bundleurl(Optional)  template url
+   * @param jsonInitData Initial data for rendering
+   */
+  public void render(String template, Map<String, Object> options, String jsonInitData) {
+    render(template, options, jsonInitData, WXRenderStrategy.APPEND_ASYNC);
+  }
+
+  /**
+   * Render template asynchronously
+   * @param template bundle js
+   * @param options  os   iphone/android/ipad
+   *                 weexversion    Weex version(like 1.0.0)
+   *                 appversion     App version(like 1.0.0)
+   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+   *                 Time    UNIX timestamp, UTC+08:00
+   *                 TTID(Optional)
+   *                 MarkertId
+   *                 Appname(Optional)  tm,tb,qa
+   *                 Bundleurl(Optional)  template url
+   * @param jsonInitData Initial data for rendering
+   * @param flag     RenderStrategy {@link WXRenderStrategy}
+   */
+  @Deprecated
+  public void render(String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
+    render(WXPerformance.DEFAULT, template, options, jsonInitData, flag);
+  }
+
+  /**
+   * Render template asynchronously
+   *
+   * @param pageName, used for performance log.
+   * @param template bundle js
+   * @param options  os   iphone/android/ipad
+   *                 weexversion    Weex version(like 1.0.0)
+   *                 appversion     App version(like 1.0.0)
+   *                 devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
+   *                 sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
+   *                 sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
+   *                 Time    UNIX timestamp, UTC+08:00
+   *                 TTID(Optional)
+   *                 MarkertId
+   *                 Appname(Optional)  tm,tb,qa
+   *                 Bundleurl(Optional)  template url
+   * @param jsonInitData Initial data for rendering
+   * @param flag     RenderStrategy {@link WXRenderStrategy}
+   */
+  public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
+    if(WXEnvironment.isApkDebugable() && WXPerformance.DEFAULT.equals(pageName)){
+       WXLogUtils.e("Please set your pageName or your js bundle url !!!!!!!");
+       return;
+    }
+    renderInternal(pageName,template,options,jsonInitData,flag);
+  }
+
+  private void ensureRenderArchor(){
+    if(mRenderContainer == null){
+      mRenderContainer = new RenderContainer(getContext());
+      mRenderContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+      mRenderContainer.setBackgroundColor(Color.TRANSPARENT);
+      mRenderContainer.setSDKInstance(this);
+      mRenderContainer.addOnLayoutChangeListener(this);
+    }
+  }
+
+  private void renderInternal(String pageName,
+                              String template,
+                              Map<String, Object> options,
+                              String jsonInitData,
+                              WXRenderStrategy flag){
+    if (mRendered || TextUtils.isEmpty(template)) {
+      return;
+    }
+
+    ensureRenderArchor();
+
+    Map<String, Object> renderOptions = options;
+    if (renderOptions == null) {
+      renderOptions = new HashMap<>();
+    }
+
+    if (WXEnvironment.sDynamicMode && !TextUtils.isEmpty(WXEnvironment.sDynamicUrl) && renderOptions.get("dynamicMode") == null) {
+      renderOptions.put("dynamicMode", "true");
+      renderByUrl(pageName, WXEnvironment.sDynamicUrl, renderOptions, jsonInitData, flag);
+      return;
+    }
+
+    mWXPerformance.pageName = pageName;
+    mWXPerformance.JSTemplateSize = template.length() / 1024;
+
+    mRenderStartTime = System.currentTimeMillis();
+    mRenderStrategy = flag;
+
+    WXSDKManager.getInstance().setCrashInfo(WXEnvironment.WEEX_CURRENT_KEY,pageName);
+
+    WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData);
+    mRendered = true;
+
+    if (TextUtils.isEmpty(mBundleUrl)) {
+      mBundleUrl = pageName;
+    }
+  }
+
+  private void renderByUrlInternal(String pageName,
+                                   final String url,
+                                   Map<String, Object> options,
+                                   final String jsonInitData,
+                                   final WXRenderStrategy flag) {
+
+    ensureRenderArchor();
+    pageName = wrapPageName(pageName, url);
+    mBundleUrl = url;
+    if(WXSDKManager.getInstance().getValidateProcessor()!=null) {
+      mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
+    }
+
+    Map<String, Object> renderOptions = options;
+    if (renderOptions == null) {
+      renderOptions = new HashMap<>();
+    }
+    if (!renderOptions.containsKey(BUNDLE_URL)) {
+      renderOptions.put(BUNDLE_URL, url);
+    }
+
+    Uri uri = Uri.parse(url);
+    if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
+      render(pageName, WXFileUtils.loadFileOrAsset(assembleFilePath(uri), mContext), renderOptions, jsonInitData, flag);
+      return;
+    }
+
+    IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
+
+    WXRequest wxRequest = new WXRequest();
+    wxRequest.url = rewriteUri(Uri.parse(url),URIAdapter.BUNDLE).toString();
+    if (wxRequest.paramMap == null) {
+      wxRequest.paramMap = new HashMap<String, String>();
+    }
+    wxRequest.paramMap.put(KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(mContext,WXEnvironment.getConfig()));
+    WXHttpListener httpListener =
+        new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
+    httpListener.setSDKInstance(this);
+    adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) httpListener);
+  }
+
+  /**
+   * Use {@link #render(String, String, Map, String, WXRenderStrategy)} instead.
+   * @param pageName
+   * @param template
+   * @param options
+   * @param jsonInitData
+   * @param width
+   * @param height
+   * @param flag
+   */
+  @Deprecated
+  public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, int width, int height, WXRenderStrategy flag) {
+    render(pageName,template,options,jsonInitData,flag);
+  }
+
+  /**
+   * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
+   * @param template bundle js
+   */
+  public void render(String template) {
+    render(WXPerformance.DEFAULT, template, null, null, mRenderStrategy);
+  }
+
+  /**
+   * Use {@link #render(String)} instead.
+   * @param template
+   * @param width
+   * @param height
+   */
+  @Deprecated
+  public void render(String template, int width, int height) {
+    render(template);
+  }
+
+  /**
+   * Use {@link #renderByUrl(String, String, Map, String, WXRenderStrategy)} instead.
+   * @param pageName
+   * @param url
+   * @param options
+   * @param jsonInitData
+   * @param width
+   * @param height
+   * @param flag
+   */
+  @Deprecated
+  public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final int width, final int height, final WXRenderStrategy flag){
+    renderByUrl(pageName,url,options,jsonInitData,flag);
+  }
+
+  public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final WXRenderStrategy flag) {
+    renderByUrlInternal(pageName,url,options,jsonInitData,flag);
+  }
+
+  private String wrapPageName(String pageName, String url) {
+    if(TextUtils.equals(pageName, WXPerformance.DEFAULT)){
+      pageName=url;
+      try {
+        Uri uri=Uri.parse(url);
+        if(uri!=null){
+          Uri.Builder builder=new Uri.Builder();
+          builder.scheme(uri.getScheme());
+          builder.authority(uri.getAuthority());
+          builder.path(uri.getPath());
+          pageName=builder.toString();
+        }
+      } catch (Exception e) {
+      }
+    }
+    return pageName;
+  }
+
+  private String assembleFilePath(Uri uri) {
+    if(uri!=null && uri.getPath()!=null){
+      return uri.getPath().replaceFirst("/","");
+    }
+    return "";
+  }
+
+  /**
+   * Refresh instance asynchronously.
+   * @param data the new data
+   */
+  public void refreshInstance(Map<String, Object> data) {
+    if (data == null) {
+      return;
+    }
+    refreshInstance(WXJsonUtils.fromObjectToJSONString(data));
+  }
+
+  /**
+   * Refresh instance asynchronously.
+   * @param jsonData the new data
+   */
+  public void refreshInstance(String jsonData) {
+    if (jsonData == null) {
+      return;
+    }
+    mRefreshStartTime = System.currentTimeMillis();
+    //cancel last refresh message
+    if (mLastRefreshData != null) {
+      mLastRefreshData.isDirty = true;
+    }
+
+    mLastRefreshData = new WXRefreshData(jsonData, false);
+
+    WXSDKManager.getInstance().refreshInstance(mInstanceId, mLastRefreshData);
+  }
+
+  public WXRenderStrategy getRenderStrategy() {
+    return mRenderStrategy;
+  }
+
+  @Override
+  public Context getUIContext() {
+    return mContext;
+  }
+
+  public String getInstanceId() {
+    return mInstanceId;
+  }
+
+  public Context getContext() {
+    if(mContext == null){
+      WXLogUtils.e("WXSdkInstance mContext == null");
+    }
+    return mContext;
+  }
+
+  public int getWeexHeight() {
+    return mRenderContainer == null ? 0: mRenderContainer.getHeight();
+  }
+
+  public int getWeexWidth() {
+    return mRenderContainer == null ? 0: mRenderContainer.getWidth();
+  }
+
+
+  public IWXImgLoaderAdapter getImgLoaderAdapter() {
+    return WXSDKManager.getInstance().getIWXImgLoaderAdapter();
+  }
+
+  public IDrawableLoader getDrawableLoader() {
+    return WXSDKManager.getInstance().getDrawableLoader();
+  }
 
+  public URIAdapter getURIAdapter(){
+    return WXSDKManager.getInstance().getURIAdapter();
+  }
 
-    private int mMaxDeepLayer;
+  public Uri rewriteUri(Uri uri,String type){
+    return getURIAdapter().rewrite(this,type,uri);
+  }
 
-    public boolean isTrackComponent() {
-        return trackComponent;
-    }
-
-    public void setTrackComponent(boolean trackComponent) {
-        this.trackComponent = trackComponent;
-    }
+  public IWXHttpAdapter getWXHttpAdapter() {
+    return WXSDKManager.getInstance().getIWXHttpAdapter();
+  }
 
-    /**
-     * Tell whether it is enabled to change the layerType
-     * {@link android.view.View#setLayerType(int, Paint)}
-     *
-     * @return True for enable to change the layerType of component, false otherwise. The default
-     * is True
-     */
-    public boolean isLayerTypeEnabled() {
-        return enableLayerType;
-    }
+  public IWXStatisticsListener getWXStatisticsListener() {
+    return mStatisticsListener;
+  }
 
-    /**
-     * Enable the ability of changing layerType. e.g. {@link android.view.View#setLayerType(int, Paint)}
-     * Disable the ability of changing layerType will have tremendous <strong>performance
-     * punishment</strong>.
-     * <p>
-     * <strong>Do not</strong> set this to false unless you know exactly what you are doing.
-     *
-     * @param enable True for enable to change the layerType of component, false otherwise. The default
-     *               is True
-     */
-    public void enableLayerType(boolean enable) {
-        enableLayerType = enable;
-    }
+  public @Nullable
+  IWebSocketAdapter getWXWebSocketAdapter() {
+    return WXSDKManager.getInstance().getIWXWebSocketAdapter();
+  }
 
-    public boolean isNeedValidate() {
-        return mNeedValidate;
+  @Deprecated
+  public void reloadImages() {
+    if (mScrollView == null) {
+      return;
     }
+  }
 
-    /*
-    *  Warning: use setInstanceViewPortWidth instead.
-    *  store custom ViewPort Width
-    */
-    @Deprecated
-    public void setViewPortWidth(int viewPortWidth) {
-        mViewPortWidth = viewPortWidth;
-    }
 
-    /**
-     * Warning: use getInstanceViewPortWidth instead.
-     *
-     * @return
-     */
-    @Deprecated
-    public static int getViewPortWidth() {
-        return mViewPortWidth;
-    }
+  public boolean isPreRenderMode() {
+    return this.isPreRenderMode;
+  }
 
-    public void setInstanceViewPortWidth(int instanceViewPortWidth) {
-        this.mInstanceViewPortWidth = instanceViewPortWidth;
-    }
+  public void setPreRenderMode(final boolean isPreRenderMode) {
+    WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+      @Override
+      public void run() {
+        WXSDKInstance.this.isPreRenderMode = isPreRenderMode;
+      }
+    },0);
+  }
 
-    public int getInstanceViewPortWidth() {
-        return mInstanceViewPortWidth;
-    }
+  public void setContext(@NonNull Context context) {
+    this.mContext = context;
+  }
 
-    public interface OnInstanceVisibleListener {
-        void onAppear();
+  /********************************
+   * begin register listener
+   ********************************************************/
+  public void registerRenderListener(IWXRenderListener listener) {
+    mRenderListener = listener;
+  }
 
-        void onDisappear();
-    }
+  @Deprecated
+  public void registerActivityStateListener(IWXActivityStateListener listener) {
 
-    private List<OnInstanceVisibleListener> mVisibleListeners = new ArrayList<>();
+  }
 
-    public WXSDKInstance(Context context) {
-        mInstanceId = WXSDKManager.getInstance().generateInstanceId();
-        init(context);
-    }
+  public void registerStatisticsListener(IWXStatisticsListener listener) {
+    mStatisticsListener = listener;
+  }
 
-    /**
-     * For unittest only.
-     */
-    WXSDKInstance(Context context, String id) {
-        mInstanceId = id;
-        init(context);
-    }
+  public void setLayoutFinishListener(@Nullable LayoutFinishListener listener) {
+    this.mLayoutFinishListener = listener;
+  }
 
+  public LayoutFinishListener getLayoutFinishListener() {
+    return this.mLayoutFinishListener;
+  }
 
-    public WXComponent getRootComponent() {
-        return mRootComp;
-    }
 
-    public void setNestedInstanceInterceptor(NestedInstanceInterceptor interceptor) {
-        mNestedInstanceInterceptor = interceptor;
-    }
+  /**set render start time*/
+  public void setRenderStartTime(long renderStartTime) {
+    this.mRenderStartTime = renderStartTime;
+  }
 
-    public WXSDKInstance createNestedInstance(NestedContainer container) {
-        WXSDKInstance sdkInstance = new WXSDKInstance(mContext);
-        if (mNestedInstanceInterceptor != null) {
-            mNestedInstanceInterceptor.onCreateNestInstance(sdkInstance, container);
-        }
-        return sdkInstance;
-    }
+  /********************************
+   * end register listener
+   ********************************************************/
 
-    public void addOnInstanceVisibleListener(OnInstanceVisibleListener l) {
-        mVisibleListeners.add(l);
-    }
 
-    public void removeOnInstanceVisibleListener(OnInstanceVisibleListener l) {
-        mVisibleListeners.remove(l);
-    }
+  /********************************
+   *  begin hook Activity life cycle callback
+   ********************************************************/
 
-    private ActivityManager mActivityManager;
+  @Override
+  public void onActivityCreate() {
 
-    public void init(Context context) {
-        mContext = context;
-        mNativeInvokeHelper = new NativeInvokeHelper(mInstanceId);
-
-        mWXPerformance = new WXPerformance();
-        mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
-        mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
-
-        mUserTrackAdapter = WXSDKManager.getInstance().getIWXUserTrackAdapter();
+    // module listen Activity onActivityCreate
+    WXModuleManager.onActivityCreate(getInstanceId());
 
+    if(mRootComp != null) {
+      mRootComp.onActivityCreate();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely,onActivityCreate can not be call!");
     }
 
-    public NativeInvokeHelper getNativeInvokeHelper() {
-        return mNativeInvokeHelper;
-    }
-
-    public void setBizType(String bizType) {
-        if (!TextUtils.isEmpty(bizType)) {
-            mWXPerformance.bizType = bizType;
-        }
-    }
+    mGlobalEventReceiver=new WXGlobalEventReceiver(this);
+    getContext().registerReceiver(mGlobalEventReceiver,new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
+  }
 
-    public ScrollView getScrollView() {
-        return mScrollView;
-    }
+  @Override
+  public void onActivityStart() {
 
-    public void setRootScrollView(ScrollView scrollView) {
-        mScrollView = scrollView;
-        if (mWXScrollViewListener != null) {
-            ((WXScrollView) mScrollView).addScrollViewListener(mWXScrollViewListener);
-        }
+    // module listen Activity onActivityCreate
+    WXModuleManager.onActivityStart(getInstanceId());
+    if(mRootComp != null) {
+      mRootComp.onActivityStart();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
     }
 
-    @Deprecated
-    public void registerScrollViewListener(WXScrollViewListener scrollViewListener) {
-        mWXScrollViewListener = scrollViewListener;
-    }
-
-    @Deprecated
-    public WXScrollViewListener getScrollViewListener() {
-        return mWXScrollViewListener;
-    }
-
-    @Deprecated
-    public void setIWXUserTrackAdapter(IWXUserTrackAdapter adapter) {
-    }
-
-    /**
-     * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
-     *
-     * @param template     bundle js
-     * @param options      os   iphone/android/ipad
-     *                     weexversion    Weex version(like 1.0.0)
-     *                     appversion     App version(like 1.0.0)
-     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-     *                     Time    UNIX timestamp, UTC+08:00
-     *                     TTID(Optional)
-     *                     MarkertId
-     *                     Appname(Optional)  tm,tb,qa
-     *                     Bundleurl(Optional)  template url
-     * @param jsonInitData Initial data for rendering
-     */
-    public void render(String template, Map<String, Object> options, String jsonInitData) {
-        render(template, options, jsonInitData, WXRenderStrategy.APPEND_ASYNC);
-    }
-
-    /**
-     * Render template asynchronously
-     *
-     * @param template     bundle js
-     * @param options      os   iphone/android/ipad
-     *                     weexversion    Weex version(like 1.0.0)
-     *                     appversion     App version(like 1.0.0)
-     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-     *                     Time    UNIX timestamp, UTC+08:00
-     *                     TTID(Optional)
-     *                     MarkertId
-     *                     Appname(Optional)  tm,tb,qa
-     *                     Bundleurl(Optional)  template url
-     * @param jsonInitData Initial data for rendering
-     * @param flag         RenderStrategy {@link WXRenderStrategy}
-     */
-    @Deprecated
-    public void render(String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
-        render(WXPerformance.DEFAULT, template, options, jsonInitData, flag);
-    }
-
-    /**
-     * Render template asynchronously
-     *
-     * @param pageName,    used for performance log.
-     * @param template     bundle js
-     * @param options      os   iphone/android/ipad
-     *                     weexversion    Weex version(like 1.0.0)
-     *                     appversion     App version(like 1.0.0)
-     *                     devid        Device id(like Aqh9z8dRJNBhmS9drLG5BKCmXhecHUXIZoXOctKwFebH)
-     *                     sysversion    Device system version(like 5.4.4、7.0.4, should be used with os)
-     *                     sysmodel     Device model(like iOS:"MGA82J/A", android:"MI NOTE LTE")
-     *                     Time    UNIX timestamp, UTC+08:00
-     *                     TTID(Optional)
-     *                     MarkertId
-     *                     Appname(Optional)  tm,tb,qa
-     *                     Bundleurl(Optional)  template url
-     * @param jsonInitData Initial data for rendering
-     * @param flag         RenderStrategy {@link WXRenderStrategy}
-     */
-    public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag) {
-        if (WXEnvironment.isApkDebugable() && WXPerformance.DEFAULT.equals(pageName)) {
-            WXLogUtils.e("Please set your pageName or your js bundle url !!!!!!!");
-            return;
-        }
-        renderInternal(pageName, template, options, jsonInitData, flag);
-    }
-
-    private void ensureRenderArchor() {
-        if (mRenderContainer == null) {
-            mRenderContainer = new RenderContainer(getContext());
-            mRenderContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
-            mRenderContainer.setBackgroundColor(Color.TRANSPARENT);
-            mRenderContainer.setSDKInstance(this);
-            mRenderContainer.addOnLayoutChangeListener(this);
-        }
-    }
-
-    private void renderInternal(String pageName,
-                                String template,
-                                Map<String, Object> options,
-                                String jsonInitData,
-                                WXRenderStrategy flag) {
-        if (mRendered || TextUtils.isEmpty(template)) {
-            return;
-        }
-
-        ensureRenderArchor();
-
-        Map<String, Object> renderOptions = options;
-        if (renderOptions == null) {
-            renderOptions = new HashMap<>();
-        }
-
-        if (WXEnvironment.sDynamicMode && !TextUtils.isEmpty(WXEnvironment.sDynamicUrl) && renderOptions.get("dynamicMode") == null) {
-            renderOptions.put("dynamicMode", "true");
-            renderByUrl(pageName, WXEnvironment.sDynamicUrl, renderOptions, jsonInitData, flag);
-            return;
-        }
-
-        mWXPerformance.pageName = pageName;
-        mWXPerformance.JSTemplateSize = template.length() / 1024;
-
-        mRenderStartTime = System.currentTimeMillis();
-        mRenderStrategy = flag;
+  }
 
-        WXSDKManager.getInstance().setCrashInfo(WXEnvironment.WEEX_CURRENT_KEY, pageName);
+  public boolean onCreateOptionsMenu(Menu menu) {
 
-        WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData);
-        mRendered = true;
-
-        if (TextUtils.isEmpty(mBundleUrl)) {
-            mBundleUrl = pageName;
-        }
+    WXModuleManager.onCreateOptionsMenu(getInstanceId(),menu);
+    if(mRootComp != null) {
+      mRootComp.onCreateOptionsMenu(menu);
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
     }
+    return true;
+  }
 
-    private void renderByUrlInternal(String pageName,
-                                     final String url,
-                                     Map<String, Object> options,
-                                     final String jsonInitData,
-                                     final WXRenderStrategy flag) {
-
-        ensureRenderArchor();
-        pageName = wrapPageName(pageName, url);
-        mBundleUrl = url;
-        if (WXSDKManager.getInstance().getValidateProcessor() != null) {
-            mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
-        }
-
-        Map<String, Object> renderOptions = options;
-        if (renderOptions == null) {
-            renderOptions = new HashMap<>();
-        }
-        if (!renderOptions.containsKey(BUNDLE_URL)) {
-            renderOptions.put(BUNDLE_URL, url);
-        }
-
-        Uri uri = Uri.parse(url);
-        if (uri != null && TextUtils.equals(uri.getScheme(), "file")) {
-            render(pageName, WXFileUtils.loadFileOrAsset(assembleFilePath(uri), mContext), renderOptions, jsonInitData, flag);
-            return;
-        }
-
-        IWXHttpAdapter adapter = WXSDKManager.getInstance().getIWXHttpAdapter();
-
-        WXRequest wxRequest = new WXRequest();
-        wxRequest.url = rewriteUri(Uri.parse(url), URIAdapter.BUNDLE).toString();
-        if (wxRequest.paramMap == null) {
-            wxRequest.paramMap = new HashMap<String, String>();
-        }
-        wxRequest.paramMap.put(KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(mContext, WXEnvironment.getConfig()));
-        WXHttpListener httpListener =
-                new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
-        httpListener.setSDKInstance(this);
-        adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) httpListener);
-    }
-
-    /**
-     * Use {@link #render(String, String, Map, String, WXRenderStrategy)} instead.
-     *
-     * @param pageName
-     * @param template
-     * @param options
-     * @param jsonInitData
-     * @param width
-     * @param height
-     * @param flag
-     */
-    @Deprecated
-    public void render(String pageName, String template, Map<String, Object> options, String jsonInitData, int width, int height, WXRenderStrategy flag) {
-        render(pageName, template, options, jsonInitData, flag);
+  @Override
+  public void onActivityPause() {
+    onViewDisappear();
+    if(!isCommit){
+      Set<String> componentTypes= WXComponentFactory.getComponentTypesByInstanceId(getInstanceId());
+      if(componentTypes!=null && componentTypes.contains(WXBasicComponentType.SCROLLER)){
+        mWXPerformance.useScroller=1;
+      }
+      mWXPerformance.maxDeepViewLayer=getMaxDeepLayer();
+      if (mUserTrackAdapter != null) {
+        mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, mWXPerformance, getUserTrackParams());
+      }
+      isCommit=true;
     }
-
-    /**
-     * Render template asynchronously, use {@link WXRenderStrategy#APPEND_ASYNC} as render strategy
-     *
-     * @param template bundle js
-     */
-    public void render(String template) {
-        render(WXPerformance.DEFAULT, template, null, null, mRenderStrategy);
-    }
-
-    /**
-     * Use {@link #render(String)} instead.
-     *
-     * @param template
-     * @param width
-     * @param height
-     */
-    @Deprecated
-    public void render(String template, int width, int height) {
-        render(template);
-    }
-
-    /**
-     * Use {@link #renderByUrl(String, String, Map, String, WXRenderStrategy)} instead.
-     *
-     * @param pageName
-     * @param url
-     * @param options
-     * @param jsonInitData
-     * @param width
-     * @param height
-     * @param flag
-     */
-    @Deprecated
-    public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final int width, final int height, final WXRenderStrategy flag) {
-        renderByUrl(pageName, url, options, jsonInitData, flag);
-    }
-
-    public void renderByUrl(String pageName, final String url, Map<String, Object> options, final String jsonInitData, final WXRenderStrategy flag) {
-        renderByUrlInternal(pageName, url, options, jsonInitData, flag);
-    }
-
-    private String wrapPageName(String pageName, String url) {
-        if (TextUtils.equals(pageName, WXPerformance.DEFAULT)) {
-            pageName = url;
-            try {
-                Uri uri = Uri.parse(url);
-                if (uri != null) {
-                    Uri.Builder builder = new Uri.Builder();
-                    builder.scheme(uri.getScheme());
-                    builder.authority(uri.getAuthority());
-                    builder.path(uri.getPath());
-                    pageName = builder.toString();
-                }
-            } catch (Exception e) {
-            }
-        }
-        return pageName;
+    // module listen Activity onActivityPause
+    WXModuleManager.onActivityPause(getInstanceId());
+    if(mRootComp != null) {
+      mRootComp.onActivityPause();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely,onActivityPause can not be call!");
     }
 
-    private String assembleFilePath(Uri uri) {
-        if (uri != null && uri.getPath() != null) {
-            return uri.getPath().replaceFirst("/", "");
-        }
-        return "";
-    }
+    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.PAUSE_EVENT);
+    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
+    mContext.sendBroadcast(intent);
+  }
 
-    /**
-     * Refresh instance asynchronously.
-     *
-     * @param data the new data
-     */
-    public void refreshInstance(Map<String, Object> data) {
-        if (data == null) {
-            return;
-        }
-        refreshInstance(WXJsonUtils.fromObjectToJSONString(data));
-    }
 
-    /**
-     * Refresh instance asynchronously.
-     *
-     * @param jsonData the new data
-     */
-    public void refreshInstance(String jsonData) {
-        if (jsonData == null) {
-            return;
-        }
-        mRefreshStartTime = System.currentTimeMillis();
-        //cancel last refresh message
-        if (mLastRefreshData != null) {
-            mLastRefreshData.isDirty = true;
-        }
+  @Override
+  public void onActivityResume() {
 
-        mLastRefreshData = new WXRefreshData(jsonData, false);
+    // notify onActivityResume callback to module
+    WXModuleManager.onActivityResume(getInstanceId());
 
-        WXSDKManager.getInstance().refreshInstance(mInstanceId, mLastRefreshData);
+    if(mRootComp != null) {
+      mRootComp.onActivityResume();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
     }
 
-    public WXRenderStrategy getRenderStrategy() {
-        return mRenderStrategy;
-    }
+    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.RESUME_EVENT);
+    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
+    mContext.sendBroadcast(intent);
 
-    @Override
-    public Context getUIContext() {
-        return mContext;
-    }
+    onViewAppear();
 
-    public String getInstanceId() {
-        return mInstanceId;
-    }
+    setViewPortWidth(mInstanceViewPortWidth);
+  }
 
-    public Context getContext() {
-        if (mContext == null) {
-            WXLogUtils.e("WXSdkInstance mContext == null");
-        }
-        return mContext;
-    }
+  @Override
+  public void onActivityStop() {
 
-    public int getWeexHeight() {
-        return mRenderContainer == null ? 0 : mRenderContainer.getHeight();
-    }
+    // notify onActivityResume callback to module
+    WXModuleManager.onActivityStop(getInstanceId());
 
-    public int getWeexWidth() {
-        return mRenderContainer == null ? 0 : mRenderContainer.getWidth();
+    if(mRootComp != null) {
+      mRootComp.onActivityStop();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onActivityStop can not be call!");
     }
 
 
-    public IWXImgLoaderAdapter getImgLoaderAdapter() {
-        return WXSDKManager.getInstance().getIWXImgLoaderAdapter();
-    }
+  }
 
-    public IDrawableLoader getDrawableLoader() {
-        return WXSDKManager.getInstance().getDrawableLoader();
-    }
+  @Override
+  public void onActivityDestroy() {
+    WXModuleManager.onActivityDestroy(getInstanceId());
 
-    public URIAdapter getURIAdapter() {
-        return WXSDKManager.getInstance().getURIAdapter();
+    if(mRootComp != null) {
+      mRootComp.onActivityDestroy();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onActivityDestroy can not be call!");
     }
 
-    public Uri rewriteUri(Uri uri, String type) {
-        return getURIAdapter().rewrite(this, type, uri);
-    }
+    destroy();
+  }
 
-    public IWXHttpAdapter getWXHttpAdapter() {
-        return WXSDKManager.getInstance().getIWXHttpAdapter();
-    }
+  @Override
+  public boolean onActivityBack() {
 
-    public IWXStatisticsListener getWXStatisticsListener() {
-        return mStatisticsListener;
-    }
+    WXModuleManager.onActivityBack(getInstanceId());
 
-    public
-    @Nullable
-    IWebSocketAdapter getWXWebSocketAdapter() {
-        return WXSDKManager.getInstance().getIWXWebSocketAdapter();
-    }
-
-    @Deprecated
-    public void reloadImages() {
-        if (mScrollView == null) {
-            return;
-        }
+    if(mRootComp != null) {
+      return mRootComp.onActivityBack();
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onActivityBack can not be call!");
     }
 
+    return false;
+  }
 
-    public boolean isPreRenderMode() {
-        return this.isPreRenderMode;
+  public boolean onBackPressed() {
+    WXComponent comp = getRootComponent();
+    if(comp != null) {
+      WXEvent events= comp.getDomObject().getEvents();
+      boolean hasBackPressed = events.contains(Constants.Event.CLICKBACKITEM);
+      if (hasBackPressed) {
+        WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.CLICKBACKITEM,null, null);
+      }
+      return hasBackPressed;
     }
+    return false;
+  }
 
-    public void setPreRenderMode(final boolean isPreRenderMode) {
-        WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                WXSDKInstance.this.isPreRenderMode = isPreRenderMode;
-            }
-        }, 0);
-    }
+    public void onActivityResult(int requestCode, int resultCode, Intent data){
+    WXModuleManager.onActivityResult(getInstanceId(),requestCode,resultCode,data);
 
-    public void setContext(@NonNull Context context) {
-        this.mContext = context;
+    if(mRootComp != null) {
+      mRootComp.onActivityResult(requestCode,resultCode,data);
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onActivityResult can not be call!");
     }
+  }
 
-    /********************************
-     * begin register listener
-     ********************************************************/
-    public void registerRenderListener(IWXRenderListener listener) {
-        mRenderListener = listener;
-    }
 
-    @Deprecated
-    public void registerActivityStateListener(IWXActivityStateListener listener) {
+  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
 
-    }
+    WXModuleManager.onRequestPermissionsResult(getInstanceId(),requestCode,permissions,grantResults);
 
-    public void registerStatisticsListener(IWXStatisticsListener listener) {
-        mStatisticsListener = listener;
+    if(mRootComp != null) {
+       mRootComp.onRequestPermissionsResult(requestCode,permissions,grantResults);
+    }else{
+      WXLogUtils.w("Warning :Component tree has not build completely, onRequestPermissionsResult can not be call!");
     }
+  }
 
-    public void setLayoutFinishListener(@Nullable LayoutFinishListener listener) {
-        this.mLayoutFinishListener = listener;
-    }
+  /********************************
+   *  end hook Activity life cycle callback
+   ********************************************************/
 
-    public LayoutFinishListener getLayoutFinishListener() {
-        return this.mLayoutFinishListener;
+  public void onViewDisappear(){
+    WXComponent comp = getRootComponent();
+    if(comp != null) {
+      WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWDISAPPEAR, null, null);
+      //call disappear of nested instances
+      for(OnInstanceVisibleListener instance:mVisibleListeners){
+        instance.onDisappear();
+      }
     }
+  }
 
-
-    /**
-     * set render start time
-     */
-    public void setRenderStartTime(long renderStartTime) {
-        this.mRenderStartTime = renderStartTime;
+  public void onViewAppear(){
+    WXComponent comp = getRootComponent();
+    if(comp != null) {
+      WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWAPPEAR,null, null);
+      for(OnInstanceVisibleListener instance:mVisibleListeners){
+        instance.onAppear();
+      }
     }
-
-    /********************************
-     * end register listener
-     ********************************************************/
+  }
 
 
-    /********************************
-     *  begin hook Activity life cycle callback
-     ********************************************************/
-
-    @Override
-    public void onActivityCreate() {
-
-        // module listen Activity onActivityCreate
-        WXModuleManager.onActivityCreate(getInstanceId());
-
-        if (mRootComp != null) {
-            mRootComp.onActivityCreate();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely,onActivityCreate can not be call!");
-        }
-
-        mGlobalEventReceiver = new WXGlobalEventReceiver(this);
-        getContext().registerReceiver(mGlobalEventReceiver, new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
-
-
-    }
-
-    public boolean onCreateOptionsMenu(Menu menu) {
-        WXModuleManager.onCreateOptionsMenu(getInstanceId(), menu);
-        if (mRootComp != null) {
-            mRootComp.onCreateOptionsMenu(menu);
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
-        }
-        return true;
-    }
-
-
-
-    @Override
-    public void onActivityStart() {
-
-        // module listen Activity onActivityCreate
-        WXModuleManager.onActivityStart(getInstanceId());
-        if (mRootComp != null) {
-            mRootComp.onActivityStart();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely,onActivityStart can not be call!");
-        }
-        WXLogUtils.i("Application onActivityStart()");
-    }
-
-    private AtomicBoolean currentGround = new AtomicBoolean(false);
-    @Override
-    public void onActivityResume() {
-        // notify onActivityResume callback to module
-        WXModuleManager.onActivityResume(getInstanceId());
-
-        if (mRootComp != null) {
-            mRootComp.onActivityResume();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
-        }
-        WXLogUtils.i("Application onActivityResume()");
-        if (currentGround.get()) {
-            WXLogUtils.i("Application  to be in the foreground");
-            Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-            intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
-            intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
-            currentGround.set(false);
-            mContext.sendBroadcast(intent);
-        }
-        onViewAppear();
+  public void onCreateFinish() {
+    if (mContext != null) {
+      runOnUiThread(new Runnable() {
 
-        setViewPortWidth(mInstanceViewPortWidth);
-    }
-
-
-    @Override
-    public void onActivityPause() {
-        onViewDisappear();
-        if (!isCommit) {
-            Set<String> componentTypes = WXComponentFactory.getComponentTypesByInstanceId(getInstanceId());
-            if (componentTypes != null && componentTypes.contains(WXBasicComponentType.SCROLLER)) {
-                mWXPerformance.useScroller = 1;
+        @Override
+        public void run() {
+          if ( mContext != null) {
+            onViewAppear();
+            View wxView= mRenderContainer;
+            if(WXEnvironment.isApkDebugable() && WXSDKManager.getInstance().getIWXDebugAdapter()!=null){
+              wxView = WXSDKManager.getInstance().getIWXDebugAdapter().wrapContainer(WXSDKInstance.this,wxView);
             }
-            mWXPerformance.maxDeepViewLayer = getMaxDeepLayer();
-            if (mUserTrackAdapter != null) {
-                mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, mWXPerformance, getUserTrackParams());
+            if(mRenderListener != null) {
+              mRenderListener.onViewCreated(WXSDKInstance.this, wxView);
             }
-            isCommit = true;
-        }
-        // module listen Activity onActivityPause
-        WXModuleManager.onActivityPause(getInstanceId());
-        if (mRootComp != null) {
-            mRootComp.onActivityPause();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely,onActivityPause can not be call!");
-        }
-        WXLogUtils.i("Application onActivityPause()");
-        if (!currentGround.get()) {
-            WXLogUtils.i("Application to be in the backround");
-            Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-            intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
-            intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
-            mContext.sendBroadcast(intent);
-            this.currentGround.set(true);
-        }
-    }
-    @Override
-    public void onActivityStop() {
-
-        // notify onActivityResume callback to module
-        WXModuleManager.onActivityStop(getInstanceId());
-
-        if (mRootComp != null) {
-            mRootComp.onActivityStop();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onActivityStop can not be call!");
+            if (mStatisticsListener != null) {
+              mStatisticsListener.onFirstView();
+            }
+          }
         }
-        WXLogUtils.i("Application onActivityStop()");
-
+      });
     }
+  }
 
-    @Override
-    public void onActivityDestroy() {
-        WXModuleManager.onActivityDestroy(getInstanceId());
-
-        if (mRootComp != null) {
-            mRootComp.onActivityDestroy();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onActivityDestroy can not be call!");
-        }
+  /**
+   * call back when update finish
+   */
+  public void onUpdateFinish() {
+    WXLogUtils.d("Instance onUpdateSuccess");
+  }
 
-        destroy();
-    }
 
-    @Override
-    public boolean onActivityBack() {
+  public void runOnUiThread(Runnable action) {
+    WXSDKManager.getInstance().postOnUiThread(action, 0);
+  }
 
-        WXModuleManager.onActivityBack(getInstanceId());
+  public void onRenderSuccess(final int width, final int height) {
+    firstScreenRenderFinished();
 
-        if (mRootComp != null) {
-            return mRootComp.onActivityBack();
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onActivityBack can not be call!");
-        }
+    long time = System.currentTimeMillis() - mRenderStartTime;
+    WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
+    WXLogUtils.renderPerformanceLog("   invokeCreateInstance",mWXPerformance.communicateTime);
+    WXLogUtils.renderPerformanceLog("   TotalCallNativeTime", mWXPerformance.callNativeTime);
+    WXLogUtils.renderPerformanceLog("       TotalJsonParseTime", mWXPerformance.parseJsonTime);
+    WXLogUtils.renderPerformanceLog("   TotalBatchTime", mWXPerformance.batchTime);
+    WXLogUtils.renderPerformanceLog("       TotalCssLayoutTime", mWXPerformance.cssLayoutTime);
+    WXLogUtils.renderPerformanceLog("       TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
+    WXLogUtils.renderPerformanceLog("       TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
 
-        return false;
-    }
 
-    public boolean onBackPressed() {
-        WXComponent comp = getRootComponent();
-        if (comp != null) {
-            WXEvent events = comp.getDomObject().getEvents();
-            boolean hasBackPressed = events.contains(Constants.Event.CLICKBACKITEM);
-            if (hasBackPressed) {
-                WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.CLICKBACKITEM, null, null);
-            }
-            return hasBackPressed;
-        }
-        return false;
+    mWXPerformance.totalTime = time;
+    if(mWXPerformance.screenRenderTime<0.001){
+      mWXPerformance.screenRenderTime =  time;
     }
-
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        WXModuleManager.onActivityResult(getInstanceId(), requestCode, resultCode, data);
-
-        if (mRootComp != null) {
-            mRootComp.onActivityResult(requestCode, resultCode, data);
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onActivityResult can not be call!");
-        }
+    mWXPerformance.componentCount = WXComponent.mComponentNum;
+    if(WXEnvironment.isApkDebugable()) {
+      WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, "mComponentNum:" + WXComponent.mComponentNum);
     }
+    WXComponent.mComponentNum = 0;
+    if (mRenderListener != null && mContext != null) {
+      runOnUiThread(new Runnable() {
 
-
-    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
-
-        WXModuleManager.onRequestPermissionsResult(getInstanceId(), requestCode, permissions, grantResults);
-
-        if (mRootComp != null) {
-            mRootComp.onRequestPermissionsResult(requestCode, permissions, grantResults);
-        } else {
-            WXLogUtils.w("Warning :Component tree has not build completely, onRequestPermissionsResult can not be call!");
-        }
-    }
-
-    /********************************
-     *  end hook Activity life cycle callback
-     ********************************************************/
-
-    public void onViewDisappear() {
-        WXComponent comp = getRootComponent();
-        if (comp != null) {
-            WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWDISAPPEAR, null, null);
-            //call disappear of nested instances
-            for (OnInstanceVisibleListener instance : mVisibleListeners) {
-                instance.onDisappear();
+        @Override
+        public void run() {
+          if (mRenderListener != null && mContext != null) {
+            mRenderListener.onRenderSuccess(WXSDKInstance.this, width, height);
+            if (mUserTrackAdapter != null) {
+              WXPerformance performance=new WXPerformance();
+              performance.errCode=WXErrorCode.WX_SUCCESS.getErrorCode();
+              performance.args=getBundleUrl();
+              mUserTrackAdapter.commit(mContext,null,IWXUserTrackAdapter.JS_BRIDGE,performance,getUserTrackParams());
             }
-        }
-    }
-
-    public void onViewAppear() {
-        WXComponent comp = getRootComponent();
-        if (comp != null) {
-            WXBridgeManager.getInstance().fireEvent(this.mInstanceId, comp.getRef(), Constants.Event.VIEWAPPEAR, null, null);
-            for (OnInstanceVisibleListener instance : mVisibleListeners) {
-                instance.onAppear();
+            if (WXEnvironment.isApkDebugable()) {
+              WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, mWXPerformance.toString());
             }
+          }
         }
+      });
     }
-
-
-    public void onCreateFinish() {
-        if (mContext != null) {
-            runOnUiThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    if (mContext != null) {
-                        onViewAppear();
-                        View wxView = mRenderContainer;
-                        if (WXEnvironment.isApkDebugable() && WXSDKManager.getInstance().getIWXDebugAdapter() != null) {
-                            wxView = WXSDKManager.getInstance().getIWXDebugAdapter().wrapContainer(WXSDKInstance.this, wxView);
-                        }
-                        if (mRenderListener != null) {
-                            mRenderListener.onViewCreated(WXSDKInstance.this, wxView);
-                        }
-                        if (mStatisticsListener != null) {
-                            mStatisticsListener.onFirstView();
-                        }
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * call back when update finish
-     */
-    public void onUpdateFinish() {
-        WXLogUtils.d("Instance onUpdateSuccess");
-    }
-
-
-    public void runOnUiThread(Runnable action) {
-        WXSDKManager.getInstance().postOnUiThread(action, 0);
+    if(!WXEnvironment.isApkDebugable()){
+      Log.e("weex_perf",mWXPerformance.getPerfData());
     }
+  }
 
-    public void onRenderSuccess(final int width, final int height) {
-        firstScreenRenderFinished();
-
-        long time = System.currentTimeMillis() - mRenderStartTime;
-        WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
-        WXLogUtils.renderPerformanceLog("   invokeCreateInstance", mWXPerformance.communicateTime);
-        WXLogUtils.renderPerformanceLog("   TotalCallNativeTime", mWXPerformance.callNativeTime);
-        WXLogUtils.renderPerformanceLog("       TotalJsonParseTime", mWXPerformance.parseJsonTime);
-        WXLogUtils.renderPerformanceLog("   TotalBatchTime", mWXPerformance.batchTime);
-        WXLogUtils.renderPerformanceLog("       TotalCssLayoutTime", mWXPerformance.cssLayoutTime);
-        WXLogUtils.renderPerformanceLog("       TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
-        WXLogUtils.renderPerformanceLog("       TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
-
-
-        mWXPerformance.totalTime = time;
-        if (mWXPerformance.screenRenderTime < 0.001) {
-            mWXPerformance.screenRenderTime = time;
-        }
-        mWXPerformance.componentCount = WXComponent.mComponentNum;
-        if (WXEnvironment.isApkDebugable()) {
-            WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, "mComponentNum:" + WXComponent.mComponentNum);
-        }
-        WXComponent.mComponentNum = 0;
-        if (mRenderListener != null && mContext != null) {
-            runOnUiThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    if (mRenderListener != null && mContext != null) {
-                        mRenderListener.onRenderSuccess(WXSDKInstance.this, width, height);
-                        if (mUserTrackAdapter != null) {
-                            WXPerformance performance = new WXPerformance();
-                            performance.errCode = WXErrorCode.WX_SUCCESS.getErrorCode();
-                            performance.args = getBundleUrl();
-                            mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.JS_BRIDGE, performance, getUserTrackParams());
-                        }
-                        if (WXEnvironment.isApkDebugable()) {
-                            WXLogUtils.d(WXLogUtils.WEEX_PERF_TAG, mWXPerformance.toString());
-                        }
-                    }
-                }
-            });
-        }
-        if (!WXEnvironment.isApkDebugable()) {
-            Log.e("weex_perf", mWXPerformance.getPerfData());
-        }
-    }
-
-    public void onRefreshSuccess(final int width, final int height) {
-        WXLogUtils.renderPerformanceLog("onRefreshSuccess", (System.currentTimeMillis() - mRefreshStartTime));
-        if (mRenderListener != null && mContext != null) {
-            runOnUiThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    if (mRenderListener != null && mContext != null) {
-                        mRenderListener.onRefreshSuccess(WXSDKInstance.this, width, height);
-                    }
-                }
-            });
-        }
-    }
-
-    public void onRenderError(final String errCode, final String msg) {
-        if (mRenderListener != null && mContext != null) {
-            runOnUiThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    if (mRenderListener != null && mContext != null) {
-                        mRenderListener.onException(WXSDKInstance.this, errCode, msg);
-                    }
-                }
-            });
-        }
-    }
-
-    public void onJSException(final String errCode, final String function, final String exception) {
-        if (mRenderListener != null && mContext != null) {
-            runOnUiThread(new Runnable() {
-
-                @Override
-                public void run() {
-                    if (mRenderListener != null && mContext != null) {
-                        StringBuilder builder = new StringBuilder();
-                        builder.append(function);
-                        builder.append(exception);
-                        mRenderListener.onException(WXSDKInstance.this, errCode, builder.toString());
-                    }
-                }
-            });
-        }
-    }
-
-
-    @Override
-    public final void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
-            oldTop, int oldRight, int oldBottom) {
-        if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
-            onLayoutChange(v);
-        }
-    }
+  public void onRefreshSuccess(final int width, final int height) {
+    WXLogUtils.renderPerformanceLog("onRefreshSuccess", (System.currentTimeMillis() - mRefreshStartTime));
+    if (mRenderListener != null && mContext != null) {
+      runOnUiThread(new Runnable() {
 
-    /**
-     * Subclass should override this method to get notifications of layout change of GodView.
-     *
-     * @param godView the godView.
-     */
-    public void onLayoutChange(View godView) {
-
-    }
-
-    private boolean mCreateInstance = true;
-
-    public void firstScreenCreateInstanceTime(long time) {
-        if (mCreateInstance) {
-            mWXPerformance.firstScreenJSFExecuteTime = time - mRenderStartTime;
-            mCreateInstance = false;
-        }
-    }
-
-    public void callNativeTime(long time) {
-        mWXPerformance.callNativeTime += time;
-    }
-
-    public void jsonParseTime(long time) {
-        mWXPerformance.parseJsonTime += time;
-    }
-
-    public void firstScreenRenderFinished() {
-        if (mEnd == true)
-            return;
-
-        mEnd = true;
-
-        if (mStatisticsListener != null && mContext != null) {
-            runOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    if (mStatisticsListener != null && mContext != null) {
-                        Trace.beginSection("onFirstScreen");
-                        mStatisticsListener.onFirstScreen();
-                        Trace.endSection();
-                    }
-                }
-            });
-        }
-
-        mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
-        WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
-        WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
-        WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", mWXPerformance.callNativeTime);
-        WXLogUtils.renderPerformanceLog("       firstScreenJsonParseTime", mWXPerformance.parseJsonTime);
-        WXLogUtils.renderPerformanceLog("   firstScreenBatchTime", mWXPerformance.batchTime);
-        WXLogUtils.renderPerformanceLog("       firstScreenCssLayoutTime", mWXPerformance.cssLayoutTime);
-        WXLogUtils.renderPerformanceLog("       firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
-        WXLogUtils.renderPerformanceLog("       firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
-    }
-
-    public void batchTime(long time) {
-        mWXPerformance.batchTime += time;
-    }
-
-    public void cssLayoutTime(long time) {
-        mWXPerformance.cssLayoutTime += time;
-    }
-
-    public void applyUpdateTime(long time) {
-        mWXPerformance.applyUpdateTime += time;
-    }
-
-    public void updateDomObjTime(long time) {
-        mWXPerformance.updateDomObjTime += time;
-    }
-
-
-    public void createInstanceFinished(long time) {
-        if (time > 0) {
-            mWXPerformance.communicateTime = time;
-        }
-    }
-
-    /**
-     * UserTrack Log
-     */
-    public void commitUTStab(final String type, final WXErrorCode errorCode) {
-        if (TextUtils.isEmpty(type) || errorCode == null) {
-            return;
+        @Override
+        public void run() {
+          if (mRenderListener != null && mContext != null) {
+            mRenderListener.onRefreshSuccess(WXSDKInstance.this, width, height);
+          }
         }
-
-        runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // Record exception if a render error happened.
-                if (mStatisticsListener != null && errorCode != WXErrorCode.WX_SUCCESS) {
-                    mStatisticsListener.onException(mInstanceId,
-                            errorCode.getErrorCode(),
-                            errorCode.getErrorMsg());
-                }
-
-                WXPerformance performance = new WXPerformance();
-                performance.errCode = errorCode.getErrorCode();
-                performance.args = errorCode.getArgs();
-                if (errorCode != WXErrorCode.WX_SUCCESS) {
-                    performance.errMsg = errorCode.getErrorMsg();
-                    if (WXEnvironment.isApkDebugable()) {
-                        WXLogUtils.d(performance.toString());
-                    }
-                }
-                if (mUserTrackAdapter != null) {
-                    mUserTrackAdapter.commit(mContext, null, type, performance, getUserTrackParams());
-                }
-            }
-        });
+      });
     }
+  }
 
-    private void destroyView(View rootView) {
-        try {
-            if (rootView instanceof ViewGroup) {
-                ViewGroup cViewGroup = ((ViewGroup) rootView);
-                for (int index = 0; index < cViewGroup.getChildCount(); index++) {
-                    destroyView(cViewGroup.getChildAt(index));
-                }
+  public void onRenderError(final String errCode, final String msg) {
+    if (mRenderListener != null && mContext != null) {
+      runOnUiThread(new Runnable() {
 
-                cViewGroup.removeViews(0, ((ViewGroup) rootView).getChildCount());
-                // Ensure that the viewgroup's status to be normal
-                WXReflectionUtils.setValue(rootView, "mChildrenCount", 0);
-
-            }
-            if (rootView instanceof Destroyable) {
-                ((Destroyable) rootView).destroy();
-            }
-        } catch (Exception e) {
-            WXLogUtils.e("WXSDKInstance destroyView Exception: ", e);
+        @Override
+        public void run() {
+          if (mRenderListener != null && mContext != null) {
+            mRenderListener.onException(WXSDKInstance.this, errCode, msg);
+          }
         }
+      });
     }
+  }
 
-    public synchronized void destroy() {
-        WXSDKManager.getInstance().destroyInstance(mInstanceId);
-        WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
-
-        if (mGlobalEventReceiver != null) {
-            getContext().unregisterReceiver(mGlobalEventReceiver);
-            mGlobalEventReceiver = null;
-        }
-        if (mRootComp != null) {
-            mRootComp.destroy();
-            destroyView(mRenderContainer);
-            mRenderContainer = null;
-            mRootComp = null;
-        }
+  public void onJSException(final String errCode, final String function, final String exception) {
+    if (mRenderListener != null && mContext != null) {
+      runOnUiThread(new Runnable() {
 
-        if (mGlobalEvents != null) {
-            mGlobalEvents.clear();
+        @Override
+        public void run() {
+          if (mRenderListener != null && mContext != null) {
+            StringBuilder builder = new StringBuilder();
+            builder.append(function);
+            builder.append(exception);
+            mRenderListener.onException(WXSDKInstance.this, errCode, builder.toString());
+          }
         }
-
-
-        mNestedInstanceInterceptor = null;
-        mUserTrackAdapter = null;
-        mScrollView = null;
-        mContext = null;
-        mRenderListener = null;
-        isDestroy = true;
-        mStatisticsListener = null;
+      });
     }
+  }
 
-    public boolean isDestroy() {
-        return isDestroy;
-    }
 
-    /**
-     * @return If you use render () the return value may be empty
-     */
-    public
-    @Nullable
-    String getBundleUrl() {
-        return mBundleUrl;
+  @Override
+  public final void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
+      oldTop, int oldRight, int oldBottom) {
+    if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
+      onLayoutChange(v);
     }
+  }
 
-    public View getRootView() {
-        return mRootComp.getRealView();
-    }
+  /**
+   * Subclass should override this method to get notifications of layout change of GodView.
+   * @param godView the godView.
+   */
+  public void onLayoutChange(View godView) {
 
-    public View getContainerView() {
-        return mRenderContainer;
-    }
+  }
 
-    @Deprecated
-    public void setBundleUrl(String url) {
-        mBundleUrl = url;
-        if (WXSDKManager.getInstance().getValidateProcessor() != null) {
-            mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
-        }
+  private boolean mCreateInstance =true;
+  public void firstScreenCreateInstanceTime(long time) {
+    if(mCreateInstance) {
+      mWXPerformance.firstScreenJSFExecuteTime = time -mRenderStartTime;
+      mCreateInstance =false;
     }
+  }
 
-    public void onRootCreated(WXComponent root) {
-        this.mRootComp = root;
-        mRenderContainer.addView(root.getHostView());
-        setSize(mRenderContainer.getWidth(), mRenderContainer.getHeight());
-    }
-
-    /**
-     * Move fixed view to container ,except it's already moved.
-     *
-     * @param fixedChild
-     */
-    public void moveFixedView(View fixedChild) {
-        if (mRenderContainer != null) {
-            ViewGroup parent;
-            if ((parent = (ViewGroup) fixedChild.getParent()) != null) {
-                if (parent != mRenderContainer) {
-                    parent.removeView(fixedChild);
-                    mRenderContainer.addView(fixedChild);
-                }
-            } else {
-                mRenderContainer.addView(fixedChild);
-            }
-        }
-    }
+  public void callNativeTime(long time) {
+    mWXPerformance.callNativeTime += time;
+  }
 
-    public void removeFixedView(View fixedChild) {
-        if (mRenderContainer != null) {
-            mRenderContainer.removeView(fixedChild);
-        }
-    }
+  public void jsonParseTime(long time) {
+    mWXPerformance.parseJsonTime += time;
+  }
 
-    public synchronized List<OnWXScrollListener> getWXScrollListeners() {
-        return mWXScrollListeners;
-    }
+  public void firstScreenRenderFinished() {
+    if(mEnd == true)
+       return;
 
-    public synchronized void registerOnWXScrollListener(OnWXScrollListener wxScrollListener) {
-        if (mWXScrollListeners == null) {
-            mWXScrollListeners = new ArrayList<>();
-        }
-        mWXScrollListeners.add(wxScrollListener);
-    }
+    mEnd = true;
 
-    private void updateRootComponentStyle(JSONObject style) {
-        Message message = Message.obtain();
-        WXDomTask task = new WXDomTask();
-        task.instanceId = getInstanceId();
-        if (task.args == null) {
-            task.args = new ArrayList<>();
-        }
-        task.args.add(WXDomObject.ROOT);
-        task.args.add(style);
-        message.obj = task;
-        message.what = WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE;
-        WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
-    }
+    if (mStatisticsListener != null && mContext != null) {
+      runOnUiThread(new Runnable() {
+        @Override
+        public void run() {
+          if (mStatisticsListener != null && mContext != null) {
+            Trace.beginSection("onFirstScreen");
+            mStatisticsListener.onFirstScreen();
+            Trace.endSection();
+          }
+        }
+      });
+    }
+
+    mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
+    WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
+    WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
+    WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", mWXPerformance.callNativeTime);
+    WXLogUtils.renderPerformanceLog("       firstScreenJsonParseTime", mWXPerformance.parseJsonTime);
+    WXLogUtils.renderPerformanceLog("   firstScreenBatchTime", mWXPerformance.batchTime);
+    WXLogUtils.renderPerformanceLog("       firstScreenCssLayoutTime", mWXPerformance.cssLayoutTime);
+    WXLogUtils.renderPerformanceLog("       firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
+    WXLogUtils.renderPerformanceLog("       firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+  }
 
-    public void setSize(int width, int height) {
-        if (width < 0 || height < 0 || isDestroy || !mRendered) {
-            return;
-        }
-        float realWidth = WXViewUtils.getWebPxByWidth(width, getInstanceViewPortWidth());
-        float realHeight = WXViewUtils.getWebPxByWidth(height, getInstanceViewPortWidth());
-
-        View godView = mRenderContainer;
-        if (godView != null) {
-            ViewGroup.LayoutParams layoutParams = godView.getLayoutParams();
-            if (layoutParams != null) {
-                if (godView.getWidth() != width || godView.getHeight() != height) {
-                    layoutParams.width = width;
-                    layoutParams.height = height;
-                    godView.setLayoutParams(layoutParams);
-                }
-
-                JSONObject style = new JSONObject();
-                WXComponent rootComponent = mRootComp;
-
-                if (rootComponent == null) {
-                    return;
-                }
-                style.put(Constants.Name.DEFAULT_WIDTH, realWidth);
-                style.put(Constants.Name.DEFAULT_HEIGHT, realHeight);
-                updateRootComponentStyle(style);
-            }
-        }
+  public void batchTime(long time) {
+    mWXPerformance.batchTime += time;
+  }
+  public void cssLayoutTime(long time) {
+      mWXPerformance.cssLayoutTime += time;
+  }
+
+  public void applyUpdateTime(long time) {
+      mWXPerformance.applyUpdateTime += time;
+  }
+
+  public void updateDomObjTime(long time) {
+      mWXPerformance.updateDomObjTime += time;
+    }
+
+
+  public void createInstanceFinished(long time) {
+    if (time > 0) {
+      mWXPerformance.communicateTime = time;
+    }
+  }
+
+  /**
+   * UserTrack Log
+   */
+  public void commitUTStab(final String type, final WXErrorCode errorCode) {
+    if (TextUtils.isEmpty(type) || errorCode == null) {
+      return;
+    }
+
+    runOnUiThread(new Runnable() {
+      @Override
+      public void run() {
+        // Record exception if a render error happened.
+        if (mStatisticsListener != null && errorCode != WXErrorCode.WX_SUCCESS) {
+          mStatisticsListener.onException(mInstanceId,
+                                          errorCode.getErrorCode(),
+                                          errorCode.getErrorMsg());
+        }
+
+        WXPerformance performance = new WXPerformance();
+        performance.errCode = errorCode.getErrorCode();
+        performance.args = errorCode.getArgs();
+        if (errorCode != WXErrorCode.WX_SUCCESS) {
+          performance.errMsg = errorCode.getErrorMsg();
+          if (WXEnvironment.isApkDebugable()) {
+            WXLogUtils.d(performance.toString());
+          }
+        }
+        if( mUserTrackAdapter!= null) {
+          mUserTrackAdapter.commit(mContext, null, type, performance, getUserTrackParams());
+        }
+      }
+    });
+  }
+
+  private void destroyView(View rootView) {
+    try {
+      if (rootView instanceof ViewGroup) {
+        ViewGroup cViewGroup = ((ViewGroup) rootView);
+        for (int index = 0; index < cViewGroup.getChildCount(); index++) {
+          destroyView(cViewGroup.getChildAt(index));
+        }
+
+        cViewGroup.removeViews(0, ((ViewGroup) rootView).getChildCount());
+        // Ensure that the viewgroup's status to be normal
+        WXReflectionUtils.setValue(rootView, "mChildrenCount", 0);
+
+      }
+      if(rootView instanceof Destroyable){
+        ((Destroyable)rootView).destroy();
+      }
+    } catch (Exception e) {
+      WXLogUtils.e("WXSDKInstance destroyView Exception: ", e);
+    }
+  }
+
+  public synchronized void destroy() {
+    WXSDKManager.getInstance().destroyInstance(mInstanceId);
+    WXComponentFactory.removeComponentTypesByInstanceId(getInstanceId());
+
+    if(mGlobalEventReceiver!=null){
+      getContext().unregisterReceiver(mGlobalEventReceiver);
+      mGlobalEventReceiver=null;
+    }
+    if(mRootComp != null ) {
+      mRootComp.destroy();
+      destroyView(mRenderContainer);
+      mRenderContainer = null;
+      mRootComp = null;
+    }
+
+    if(mGlobalEvents!=null){
+      mGlobalEvents.clear();
+    }
+
+
+    mNestedInstanceInterceptor = null;
+    mUserTrackAdapter = null;
+    mScrollView = null;
+    mContext = null;
+    mRenderListener = null;
+    isDestroy = true;
+    mStatisticsListener = null;
+  }
+
+  public boolean isDestroy(){
+    return isDestroy;
+  }
+
+  /**
+   * @return If you use render () the return value may be empty
+   */
+  public @Nullable String getBundleUrl() {
+    return mBundleUrl;
+  }
+
+  public View getRootView() {
+    return mRootComp.getRealView();
+  }
+
+  public View getContainerView() {
+    return mRenderContainer;
+  }
+
+  @Deprecated
+  public void setBundleUrl(String url){
+    mBundleUrl = url;
+    if(WXSDKManager.getInstance().getValidateProcessor()!=null) {
+      mNeedValidate = WXSDKManager.getInstance().getValidateProcessor().needValidate(mBundleUrl);
+    }
+  }
+
+  public void onRootCreated(WXComponent root) {
+    this.mRootComp = root;
+    mRenderContainer.addView(root.getHostView());
+    setSize(mRenderContainer.getWidth(),mRenderContainer.getHeight());
+  }
+
+  /**
+   * Move fixed view to container ,except it's already moved.
+   * @param fixedChild
+   */
+  public void moveFixedView(View fixedChild){
+    if(mRenderContainer != null) {
+      ViewGroup parent;
+      if((parent = (ViewGroup) fixedChild.getParent()) != null){
+        if (parent != mRenderContainer) {
+          parent.removeView(fixedChild);
+          mRenderContainer.addView(fixedChild);
+        }
+      }else{
+        mRenderContainer.addView(fixedChild);
+      }
+    }
+  }
+
+  public void removeFixedView(View fixedChild){
+    if(mRenderContainer != null) {
+      mRenderContainer.removeView(fixedChild);
+    }
+  }
+
+  public synchronized List<OnWXScrollListener> getWXScrollListeners() {
+    return mWXScrollListeners;
+  }
+
+  public synchronized void registerOnWXScrollListener(OnWXScrollListener wxScrollListener) {
+    if(mWXScrollListeners==null){
+      mWXScrollListeners=new ArrayList<>();
+    }
+    mWXScrollListeners.add(wxScrollListener);
+  }
+
+  private void updateRootComponentStyle(JSONObject style) {
+    Message message = Message.obtain();
+    WXDomTask task = new WXDomTask();
+    task.instanceId = getInstanceId();
+    if (task.args == null) {
+      task.args = new ArrayList<>();
+    }
+    task.args.add(WXDomObject.ROOT);
+    task.args.add(style);
+    message.obj = task;
+    message.what = WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE;
+    WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
+  }
+
+  public void setSize(int width, int height) {
+    if (width < 0 || height < 0 || isDestroy || !mRendered) {
+      return;
+    }
+    float realWidth = WXViewUtils.getWebPxByWidth(width,getInstanceViewPortWidth());
+    float realHeight = WXViewUtils.getWebPxByWidth(height,getInstanceViewPortWidth());
+
+    View godView = mRenderContainer;
+    if (godView != null) {
+      ViewGroup.LayoutParams layoutParams = godView.getLayoutParams();
+      if (layoutParams != null) {
+        if(godView.getWidth() != width || godView.getHeight() != height) {
+          layoutParams.width = width;
+          layoutParams.height = height;
+          godView.setLayoutParams(layoutParams);
+        }
+
+        JSONObject style = new JSONObject();
+        WXComponent rootComponent = mRootComp;
+
+        if(rootComponent == null){
+          return;
+        }
+        style.put(Constants.Name.DEFAULT_WIDTH, realWidth);
+        style.put(Constants.Name.DEFAULT_HEIGHT, realHeight);
+        updateRootComponentStyle(style);
+      }
+    }
+  }
+
+  /*Global Event*/
+  private HashMap<String, List<String>> mGlobalEvents = new HashMap<>();
+
+  public void fireGlobalEventCallback(String eventName, Map<String,Object> params){
+    List<String> callbacks=mGlobalEvents.get(eventName);
+    if(callbacks!=null){
+      for(String callback:callbacks){
+        WXSDKManager.getInstance().callback(mInstanceId,callback,params,true);
+      }
+    }
+  }
+
+  /**
+   * Fire event callback on a element.
+   * @param elementRef
+   * @param type
+   * @param data
+   * @param domChanges
+   */
+  public void fireEvent(String elementRef,final String type, final Map<String, Object> data,final Map<String, Object> domChanges){
+    WXBridgeManager.getInstance().fireEventOnNode(getInstanceId(),elementRef,type,data,domChanges);
+  }
+
+  public void fireEvent(String elementRef,final String type, final Map<String, Object> data){
+    fireEvent(elementRef,type,data,null);
+  }
+
+  public void fireEvent(String ref, String type){
+    fireEvent(ref,type,new HashMap<String, Object>());
+  }
+
+  protected void addEventListener(String eventName, String callback) {
+    if (TextUtils.isEmpty(eventName) || TextUtils.isEmpty(callback)) {
+      return;
+    }
+    List<String> callbacks = mGlobalEvents.get(eventName);
+    if (callbacks == null) {
+      callbacks = new ArrayList<>();
+      mGlobalEvents.put(eventName, callbacks);
+    }
+    callbacks.add(callback);
+  }
+  protected void removeEventListener(String eventName, String callback) {
+    if (TextUtils.isEmpty(eventName) || TextUtils.isEmpty(callback)) {
+      return;
+    }
+    List<String> callbacks = mGlobalEvents.get(eventName);
+    if (callbacks != null) {
+      callbacks.remove(callback);
+    }
+  }
+
+  protected void removeEventListener(String eventName) {
+    if (TextUtils.isEmpty(eventName)) {
+      return;
+    }
+    mGlobalEvents.remove(eventName);
+  }
+
+  /**
+   * Notifies WEEX that this event has occurred
+   * @param eventName WEEX register event
+   * @param module Events occur in this Module
+   * @param params The parameters to be notified to WEEX are required
+   */
+  public void fireModuleEvent(String eventName, WXModule module,Map<String, Object> params) {
+    if (TextUtils.isEmpty(eventName) || module == null) {
+      return;
+    }
+
+    Map<String, Object> event = new HashMap<>();
+    event.put("type", eventName);
+    event.put("module", module.getModuleName());
+    event.put("data", params);
+
+    List<String> callbacks = module.getEventCallbacks(eventName);
+    if (callbacks != null) {
+      for (String callback : callbacks) {
+        SimpleJSCallback jsCallback = new SimpleJSCallback(mInstanceId, callback);
+        if (module.isOnce(callback)) {
+          jsCallback.invoke(event);
+        } else {
+          jsCallback.invokeAndKeepAlive(event);
+        }
+      }
+    }
+  }
+
+  /**
+   * Check whether the current module registered the event
+   * @param eventName EventName register in weex
+   * @param module Events occur in this Module
+   * @return  register->true
+   */
+  public boolean checkModuleEventRegistered(String eventName,WXModule module) {
+    if (module != null) {
+      List<String> events = module.getEventCallbacks(eventName);
+      if (events != null && events.size() > 0) {
+        return true;
+      }
     }
+    return false;
+  }
 
-    /*Global Event*/
-    private HashMap<String, List<String>> mGlobalEvents = new HashMap<>();
+  public WXPerformance getWXPerformance(){
+    return mWXPerformance;
+  }
 
-    public void fireGlobalEventCallback(String eventName, Map<String, Object> params) {
-        List<String> callbacks = mGlobalEvents.get(eventName);
-        if (callbacks != null) {
-            for (String callback : callbacks) {
-                WXSDKManager.getInstance().callback(mInstanceId, callback, params, true);
-            }
-        }
-    }
+  public Map<String, Serializable> getUserTrackParams() {
+    return mUserTrackParams;
+  }
 
-    /**
-     * Fire event callback on a element.
-     *
-     * @param elementRef
-     * @param type
-     * @param data
-     * @param domChanges
-     */
-    public void fireEvent(String elementRef, final String type, final Map<String, Object> data, final Map<String, Object> domChanges) {
-        WXBridgeManager.getInstance().fireEventOnNode(getInstanceId(), elementRef,

<TRUNCATED>


[5/8] incubator-weex git commit: add onActivityResume\onActivityPause event wx_global_action duplicate

Posted by so...@apache.org.
add onActivityResume\onActivityPause event wx_global_action  duplicate


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/37f05fe9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/37f05fe9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/37f05fe9

Branch: refs/heads/0.14-dev
Commit: 37f05fe9270519732b3e7615e05769f76d223a93
Parents: 56b1840
Author: hao.haoh <ha...@taobao.com>
Authored: Thu Jun 15 14:38:50 2017 +0800
Committer: hao.haoh <ha...@taobao.com>
Committed: Thu Jun 15 14:38:50 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     | 27 ++++++++++++++------
 1 file changed, 19 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/37f05fe9/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 2db6fb3..d849c31 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -81,6 +81,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
 
@@ -737,6 +738,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
     return true;
   }
+  private AtomicBoolean currentGround = new AtomicBoolean(false);
 
   @Override
   public void onActivityPause() {
@@ -760,10 +762,15 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       WXLogUtils.w("Warning :Component tree has not build completely,onActivityPause can not be call!");
     }
 
-    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.PAUSE_EVENT);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
-    mContext.sendBroadcast(intent);
+    WXLogUtils.i("Application onActivityPause()");
+    if (!currentGround.get()) {
+      WXLogUtils.i("Application to be in the backround");
+      Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+      intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
+      intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
+      mContext.sendBroadcast(intent);
+      this.currentGround.set(true);
+    }
   }
 
 
@@ -779,10 +786,14 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       WXLogUtils.w("Warning :Component tree has not build completely, onActivityResume can not be call!");
     }
 
-    Intent intent=new Intent(WXGlobalEventReceiver.EVENT_ACTION);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_NAME,Constants.Event.RESUME_EVENT);
-    intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID,getInstanceId());
-    mContext.sendBroadcast(intent);
+    if (currentGround.get()) {
+      WXLogUtils.i("Application  to be in the foreground");
+      Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
+      intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
+      intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
+      currentGround.set(false);
+      mContext.sendBroadcast(intent);
+    }
 
     onViewAppear();