Skip to content

android api

zhang chen edited this page Jun 13, 2018 · 2 revisions

小程序开发API

1 小程序生命周期管理

开发者需要了解小程序生命周期,并且在修改小程序源码或者利用小程序SDK源码进行集成时遵循生命周期管理约定,使小程序正确运行并保持兼容。

1.1 小程序创建和销毁

小程序有两种启动模式,分别为小程序包启动模式和小程序页面启动模式,每种模式均支持离线化和预热加载,在尚未进行预热的情况下,也仍然可以正确加载并展示小程序页面。

1.1.1 小程序包模式

小程序包模式会加载一个具有特定 ID 的程序包,小程序包是一个zip文件,并且需要包含一conf/Manifest.js 声明文件,用于声明小程序包含的各个页面以及对应的小程序框架版本。 需要用小程序包模式启动时,可以调用如下方法:

/**
* 使用这个方法启动一个小程序包
* @param liteAppID 需要启动的小程序包的ID
* @param needUpdate 小程序包是否需要进行更新
* @param context 传入Android上下文
**/
public static void startLiteApp(String liteAppID, boolean needUpdate, Activity context)

1.1.2 小程序页面模式

小程序页面模式需要开发者自行获取小程序页面代码,并且启动一个独立的小程序页面,与小程序包模式类似

/**
* 使用这个方法启动一个小程序单页面
* @param pageJS 小程序页面javascript
* @param context 传入Android上下文
*/
public static void starLiteAppSinglePage(String pageJS,Activity context)

1.1.3 小程序预热

小程序会使用webview作为显示容器,因webview需要一定时间才能完成首次加载,我们可以根据自己的情况进行小程序预热,在预热时会在webview中启动小程序框架,所以预热仅可以对最近几个框架版本的小程序生效,不再兼容的小程序启动时 会运行在兼容模式,不能使用预热完成的容器。

/**
* 使用这个方法预热小程序
* @param count 预热的容器个数
* @param context 传入Android上下文
*/
public static void prepareLiteApp(int count,Activity context)

1.1.4 小程序清理

小程序会启动一个单独的进程运行,如果需要清理小程序进程,可以调用下列API

/**
* 使用这个方法清理小程序
* @param context 传入Android上下文
*/
public static void killLiteApp(Activity context)

1.2 小程序生命周期事件

对小程序进行编程是针对小程序生命周期的切面进行编程,因此小程序提供了各类生命周期。包含小程序容器的主要切面供开发者编程。

  • BRIDGE_LOAD_START 框架开始加载
  • BRIDGE_LOAD_FINISH 框架加载完成
  • PAGE_CREATE 页面开始创建
  • PAGE_RESUME 页面开始活动
  • PAGE_PAUSE 页面停止活动
  • PAGE_DESTROY 页面销毁

1.2.1 监听生命周期

小程序生命周期通过同步时间形式传到 java层,开发者可以根据自己需要注册对应的监听器,监听需要的生命周期事件

public interface IBridgeEventListener {
    /**
     * 实现这一回调用于拦截事件监听,监听事件时会以同步方式等待事件回调完成再继续进行* 小程序线程,一旦事件被拦截,所有监听器的 onEvent 方法都不再会被调用,事件直接
     * 结束,返回true来对事件进行拦截。
     * */
    boolean interceptEvent(BridgeEvent event);
    /**
     * 实现这一方法接受所有没有被拦截的事件
     * */
    void onEvent(BridgeEvent event);
}

生命周期的管理统一在 EventBridge中进行,用户可以对EventBridge进行注册监听器和发送事件等操作

public interface IEventBridge {
    /**
     * Register a listener to view bridge, you can register multiple times for one listener
     * for different event types and see which type current listener registered
     * @param eventType only events match with {@link BridgeEvent#getType()} event will trigger
     *                  listener registered.
     * @param listener listener to be registered
     * */
    void registerBridgeListener(String eventType, IBridgeEventListener listener);

    /**
     * Trigger event, this will cause event to be triggered on async thread and will not block main
     * thread.
     * @param event you should give a new {@link BridgeEvent} for listeners to process
     * */
    void triggerEvent(BridgeEvent event);
}

1.2.2 发送自定义事件

用户可以使用EventBridge 发送自定义事件,每个事件需要绑定对应的小程序上下文,用户可以调用javascript 层和java层的对应接口来发送自定义事件,可以参照Demo工程中的应用方式。

/**
 * Using this type to trigger js script methods in executor.from view layer
 */
public class BridgeEvent {
    /**
     * Event name used as type or key for each type
     * */
    private String type;
    /**
     * Event data usually a json object
     * */
    private String data;

    /**
     * Show if this event has been intercepted
     **/
    private boolean intercepted = false;

    /***
     * Retained protect
     */
    private boolean retainedProtect = false;

    /**
     * Context for this bridge event
     * */
    private LiteAppContext context;

    /**
     * Related native event callback object native pointer,
     * should be attached to javascript event object to protect
     * native event and call event callbacks
     **/
    private long nativeObjectHandle;
}

2 小程序默认组件

小程序核心本身只提供事件机制,小程序的具体功能由默认组件提供。目前默认组件提供包管理和一部分简单的原生控件,开发者可以以此为基础开发自己的定制组件,并提交定制组件到小程序主分支,以使得其他集成方升级后也支持这部分功能。

2.1 包管理组件

用户需要提供一个 LiteAppHttpClient 并实现各个接口来支持从自己的服务器上下载小程序离线包,Demo中提供的实现是从服务端下载一个zip包并解压到小程序缓存目录中的实现模式,用户也可以根据自己的需要更换其他模式,但是需要保证小程序的文件夹结构保持统一。包管理中需要支持如下方法确保小程序能够正确获取到所需要小程序路径下的文件和图片等资源,并且能够检查小程序更新。

LiteAppFileProvider{
    public List<LiteAppDescription> searchLiteApp(String searchText, Context context
            ,boolean forceUpdate) 
    public LiteAppDescription checkManifestUpdate(Context context, String id, String cachedVersion)
    public String getLiteAppFile(String id, String filePath, Context context)
    public byte[] getImageBytes(String id, String path)
}

2.2 Native 控件组件

当用户需要自定义小程序控件时,可以使用如下方式向组件库添加自定义小程序控件,自定义小程序控件会出现在 natvie 控件接口调用时的指定位置上。可以选择随webview页面滚动,或者悬挂在屏幕固定位置。

public class VideoBoxWidget extends BaseLiteAppNativeWidget {
    @Override
    public View createNativeView(int top, int left, int width, int height, JSONObject viewData, Context context, LiteAppContext liteAppContext){
        //TODO return your view 
        return null;
    }
}

NativeViewProvider.getInstance().registerWidget("video",new VideoBoxWidget());

2.3 网络通信组件

用户需要为小程序提供网络实现,用于提供小程序的网络访问和代理。Demo 中提供一个基于OKhttp的通用实现

/**
 * Using this class to initialize hal net working and provide http request
 * in javascript context, call hal instance to create a instance of hal network
 */
public class LiteAppNetworkProvider {
    public static void executeNetworkRequest(LiteAppNetworkRequest request)
}

2.4 分享组件

已经提供了一个用于小程序分享到浏览器的组件实现,用户可以扩展这一组件,提供更多分享功能。

2.5 路由组件

提供一个默认的支持小程序包内部路由的路由组件,用户可以扩展这一组件支持在App内部的全局路由,或者小程序的相互调用。

3 小程序自定义组件

用户可以自定义一部分小程序组件,我们推荐继承 BasePlugin 对象,并监听组件相关的事件,来实现对应的功能。

3.1 自定义组件注册

继承BasePlugin对象的组件,调用自身的attach方法可以直接进行注册,或者也可以参照BasePlugin源码进行注册,注册后的组件可以监听到所有自定义或者小程序生命周期事件。

new SharePlugin().attach();

3.2 操作容器

获取一个事件后,可以通过事件获得小程序容器,并对容器的对应API进行操作,包括加入原生控件,或者直接在容器中执行javascript代码等。

//获取容器原生层 layout
final FrameLayout nativeLayout = ((LiteAppPage)event.getContext()).getContainer().getNativeLayerView();
//获取容器原生悬浮层 layout 
final FrameLayout nativeHoverLayout = ((LiteAppPage)event.getContext()).getContainer().getNativeHoverLayer();

当获取了容器后,就可以对容器进行各种操作。

3.3 Javascript互操作

获取一个事件后,还可以获取到事件对应的小程序 javascript 执行线程,可以通过ExecutorManager类,对该线程进行操作,并直接javascript片段。例如在输入框产生输入事件后

ExecutorManager.executeScript(
    liteAppContext, "QiyiBridge.bridgeGetEvent(" + eventContent.toString() +");");

3.4 事件回调

从javascript层产生的事件,还可以携带回调方法,根据回调方法的名称,可以从java层直接调用回调方法,用来同步返回事件结果,例如网络访问完成后的访问结果。

if(request.isSuccess()){
                ExecutorManager.callNativeRefFunction(networkEvent.getContext(),
                        networkEvent.getNativeObjectHandle(),"success",request.getResultData());
                ExecutorManager.disposeNativeRef(networkEvent.getContext(),
                        networkEvent.getNativeObjectHandle());
            } else {
                ExecutorManager.callNativeRefFunction(networkEvent.getContext(),
                        networkEvent.getNativeObjectHandle(),"fail",String.valueOf(request.getResultCode()));
                ExecutorManager.disposeNativeRef(networkEvent.getContext(),
                        networkEvent.getNativeObjectHandle());
            }
Clone this wiki locally