自定義 API
本文分別從以下兩個方面對自定義 API 進行詳細(xì)的介紹:
小程序調(diào)用客戶端自定義 API;
客戶端發(fā)送小程序自定義事件。
小程序調(diào)用客戶端自定義 API
小程序調(diào)用客戶端自定義 API 步驟如下:
客戶端自定義 API。
自定義 class 繼承自
SimpleBridgeExtension
。public class CustomApiBridgeExtension extends SimpleBridgeExtension{ }
注意請不要混淆該類和方法。
實現(xiàn)自定義方法。代碼示例如下:
public class CustomApiBridgeExtension extends SimpleBridgeExtension{ @ActionFilter public void tinyToNative(@BindingApiContext ApiContext apiContext, @BindingRequest JSONObject params, @BindingParam("param1") String param1, @BindingParam("param2") String param2, @BindingCallback BridgeCallback callback) { ··· } }
tinyToNative
,表示小程序側(cè)的調(diào)用方法名稱,需要在@ActionFilter
中添加。方法中的參數(shù),表示小程序側(cè)傳過來的參數(shù)以及客戶端側(cè)的一些 context 和 bridge。非必填,按實際需求增刪。具體請參考 自定義方法參數(shù)。
生成 JSONObject 結(jié)果,并將結(jié)果返回小程序。代碼示例如下:
public class CustomApiBridgeExtension extends SimpleBridgeExtension{ @ActionFilter public void tinyToNative(@BindingApiContext ApiContext apiContext, @BindingRequest JSONObject params, @BindingParam("param1") String param1, @BindingParam("param2") String param2, @BindingCallback BridgeCallback callback) { ··· JSONObject result = BridgeResponse.SUCCESS.get(); result.put("custom_message","value"); // 將結(jié)果返回給小程序 callback.sendJSONResponse(result); } }
示例代碼補充說明如下:
生成結(jié)果 JSONObject 成功請調(diào)用:
JSONObject result = BridgeResponse.SUCCESS.get();
若失敗請調(diào)用:
JSONObject result = BridgeResponse.Error.newError(errorCode,errorMessage).get();
結(jié)果中可加自定義的參數(shù)。
result.put("custom_message","value");
將最終 JSONObject 結(jié)果返回小程序的 callback 是自定義方法參數(shù)中的
@BindingCallback BridgeCallback callback
。callback.sendJSONResponse(result);
自定義方法參數(shù),具體說明如下:
@BindingId
:String 類型,傳入當(dāng)前一次通信的 workId。@BindingNode
:Scope 類型,App.class 或 Page.class。框架按對應(yīng)類型傳入當(dāng)前 App 或 Page。@BindingApiContext
:ApiContext 類型,通過該實例拿到當(dāng)前 API 的 context。@BindingExecutor
:Executor 類型。選擇不同的 Executor,并在其線程中執(zhí)行對應(yīng)的邏輯。Executor 類型名稱、描述、優(yōu)先級信息見下表。Executor 類型名稱
描述
優(yōu)先級
ExecutorType.SYNC
直接執(zhí)行不切線程,便于封裝。
無
ExecutorType.UI
前臺 UI 所依賴優(yōu)先級最高的后臺任務(wù),不容忍排隊。
{@link Thread#NORM_PRIORITY}
ExecutorType.URGENT_DISPLAY
前臺 UI 所依賴優(yōu)先級最高的后臺任務(wù),不容忍排隊。
{@link Thread#MAX_PRIORITY}
ExecutorType.URGENT
前臺 UI 所依賴優(yōu)先級最高的后臺任務(wù),不容忍排隊。
{@link Thread#NORM_PRIORITY}
ExecutorType.NORMAL
普通非緊急的后臺任務(wù),容忍排隊。
{@link Thread#MIN_PRIORITY}
ExecutorType.IO
文件 IO 類操作持久化任務(wù)。耗時可預(yù)計,不久成功或發(fā)生異常兩種情況之一。
{@link Thread#MIN_PRIORITY}
ExecutorType.NETWORK
網(wǎng)絡(luò)相關(guān)的后臺任務(wù)。耗時視條件波動。典型使用場景為發(fā)起 RPC 請求。
{@link Thread#MIN_PRIORITY}
ExecutorType.IDLE
閑散線程池,用于埋點等對耗時完全不敏感的任務(wù)。可用單線程池實現(xiàn)。
無
@BindingRequest
:JSONObject 類型,將小程序側(cè)的參數(shù)以 JSONObject 形式傳入。@BindingParam
:默認(rèn)值為 String,對應(yīng)的是小程序側(cè)的自定義參數(shù)的 key。對應(yīng)值支持的參數(shù)包括 string、int、long、float、double、boolean。支持自定義 default 值。@BindingParam(value = "stringParam", stringDefault = "default") String stringParam @BindingParam(value = "intParam", intDefault = 1) int intParam @BindingParam(value = "longParam", longDefault = 9223372036854775807L) long longParam @BindingParam(value = "floatParam", floatDefault = 1.0F) float floatParam @BindingParam(value = "doubleParam", doubleDefault = 1.79769313486231570e+308d) double doubleParam @BindingParam(value = "booleanParam", booleanDefault = true) boolean booleanParam
@BindingCallback
:BridgeCallback 類型,通過 BridgeCallback 可以向小程序發(fā)送結(jié)果。
示例代碼
public class CustomApiBridgeExtension extends SimpleBridgeExtension { private static final String TAG = "CustomApiBridgeExtension"; @ActionFilter public void tinyToNative(@BindingId String id, @BindingNode(App.class) App app, @BindingNode(Page.class) Page page, @BindingApiContext ApiContext apiContext, @BindingExecutor(ExecutorType.UI) Executor executor, @BindingRequest JSONObject params, @BindingParam("param1") String param1, @BindingParam("param2") String param2, @BindingCallback BridgeCallback callback) { RVLogger.d(TAG, "id: "+id+ "\napp: "+app.toString()+ "\npage: "+page.toString()+ "\napiContext: "+apiContext.toString()+ "\nexecutor: "+executor.toString()); RVLogger.d(TAG, JSONUtils.toString(params)); JSONObject result = BridgeResponse.SUCCESS.get(); result.put("message", "客戶端接收到參數(shù):" + param1 + ", " + param2 + "\n返回 Demo 當(dāng)前包名:" + apiContext.getActivity().getPackageName()); // 將結(jié)果返回給小程序 callback.sendJSONResponse(result); } }
客戶端注冊自定義 API。容器初始化完成后,調(diào)用注冊方法即可完成自定義 API 注冊。注意不要混淆類名。
MriverEngine.registerBridge(CustomApiBridgeExtension.class);
小程序側(cè)調(diào)用。代碼示例如下:
my.call('tinyToNative', { param1: 'p1aaa', param2: 'p2bbb' }, (result) => { console.log(result); my.showToast({ type: 'none', content: result.message, duration: 3000, }); })
示例代碼內(nèi)容說明如下:
第一個參數(shù)為 action,與客戶端自定義方法名
@ActionFilter
注解標(biāo)注保持一致。第二個參數(shù)為自定義參數(shù)。此示例中,客戶端側(cè)可以通過
@BindingRequest JSONObject
或@BindingParam("param1") String param1
來接收,其中 param1、param2 值為任意字母和數(shù)字組合字符串。param1、 param2 僅為示例,自定義參數(shù)值支持的類型包括 String、int、long、boolean、float、double。第三個參數(shù)為客戶端的回調(diào)。
客戶端發(fā)送小程序自定義事件
客戶端發(fā)送小程序自定義事件步驟如下:
小程序注冊事件。
// 第一個參數(shù)為自定義事件名,第二個參數(shù)是回調(diào) my.on('nativeToTiny', (res) = >{ my.showToast({ type: 'none', content: JSON.stringify(res), duration: 3000, success: () = >{}, fail: () = >{}, complete: () = >{} }); })
客戶端發(fā)送事件。
// 模擬發(fā)送的數(shù)據(jù) JSONObject jo = new JSONObject(); jo.put("index", index); AppManager appManager = RVProxy.get(AppManager.class); if (null != appManager) { // 通過 AppManager 拿到當(dāng)前運行的小程序?qū)嵗? App app = appManager.findAppByAppId("2018080616290001"); if(null!=app){ // 向小程序發(fā)送信息 // 第一個參數(shù)為當(dāng)前小程序活動頁面,第二個為自定義的事件名,第三個參數(shù)為發(fā)送的數(shù)據(jù) MriverEngine.sendToRender(app.getActivePage(), "nativeToTiny", jo, null); } }