目录

Android API

优质
小牛编辑
131浏览
2023-12-01

这里介绍 FinClip 小程序 SDK 提供了哪些能力,以及API的详细说明和使用示例。

1. 基础API

1.1 SDK初始化

在使用小程序的API之前,需要先初始化小程序SDK。只有成功初始化之后,才能使用SDK提供的API,否则API都无法调用。

API

/**
 * 初始化小程序SDK
 *
 * @param application  [android.app.Application]实例
 * @param finAppConfig [FinAppConfig]实例,小程序框架的配置信息
 * @param finCallback 初始化状态回调接口
 */
fun init(application: Application, finAppConfig: FinAppConfig, finCallback: FinCallback<Any?>?)

调用示例

·Kotlin
val config = FinAppConfig.Builder()
    .setAppKey("SDK Key")
    .setAppSecret("SDK Secret")
    .setApiUrl("服务器地址")
    .setApiPrefix("服务器接口请求路由前缀")
    .build()
FinAppClient.init(application, config, object : FinCallback<Any?> {
    override fun onSuccess(result: Any?) {
    }

    override fun onProgress(status: Int, info: String?) {
    }

    override fun onError(code: Int, error: String?) {
    }
})
·Java
FinAppConfig config = new FinAppConfig.Builder()
        .setAppKey("SDK Key")
        .setAppSecret("SDK Secret")
        .setApiUrl("服务器地址")
        .setApiPrefix("服务器接口请求路由前缀")
        .build();
FinAppClient.INSTANCE.init(this, config, new FinCallback<Object>() {
    @Override
    public void onSuccess(Object result) {
    }

    @Override
    public void onError(int code, String error) {
        Toast.makeText(SampleApplication.this, "SDK初始化失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProgress(int status, String info) {

    }
});

注意

  1. 2.13.102版本开始,FinClip SDK 支持配置多个服务器信息,可以同时打开多个不同服务器上的小程序,所以我们提供了配置多个服务器信息的方式。
  2. Builder().setAppKeyBuilder().setAppSecret方式初始化单服务器的方法未来可能会启用,请优先使用多服务器初始化的方式。
// 服务器信息集合
List<FinStoreConfig> storeConfigs = new ArrayList<>();

// 服务器1的信息
FinStoreConfig storeConfig1 = new FinStoreConfig(
        "SDK Key信息",   // SDK Key
        "SDK Secret信息",   // SDK Secret
        "服务器1的地址",   // 服务器地址
        "服务器1的数据上报服务器地址",   // 数据上报服务器地址
        "/api/v1/mop/",   // 服务器接口请求路由前缀
        "", // SDK指纹
        "加密方式"   // 加密方式,国密:SM,md5: MD5
);
storeConfigs.add(storeConfig1);

// 服务器2的信息
FinStoreConfig storeConfig2 = new FinStoreConfig(
        "SDK Key信息",   // SDK Key
        "SDK Secret信息",   // SDK Secret
        "服务器2的地址",   // 服务器地址
        "服务器2的数据上报服务器地址",   // 数据上报服务器地址
        "/api/v1/mop/",   // 服务器接口请求路由前缀
        "",  // SDK指纹
        "加密方式"   // 加密方式,国密:SM,md5: MD5
);
storeConfigs.add(storeConfig2);

FinAppConfig config = new FinAppConfig.Builder()
        .setFinStoreConfigs(storeConfigs) // 服务器信息集合
        .build();

1.2 打开小程序

打开小程序,其实是有两个场景:

  1. 普通的打开小程序,这里一般只需要小程序id和服务器地址即可,只能打开上架的线上版本小程序;
  2. 加密信息打开小程序,这个场景是扫描小程序平台上的二维码,得到二维码里的内容,然后使用二维码里的info(即加密信息)打开小程序。

1.2.1 普通打开小程序

打开小程序时,会先判断本地是否有缓存的小程序,如果没有,则会自动从远程服务器上下载小程序,然后打开。如果有缓存的小程序,则会先打开本地小程序,然后在后台校验服务器端是否有新版本。

如果有,则下载新版小程序,下次打开时,就会使用新版小程序;如果没有新版本,则什么也不做。

API
/**
 * 启动小程序
 *
 * @param appId 小程序id
 */
fun startApplet(context: Context, appId: String)
调用示例
·Kotlin
FinAppClient.appletApiManager.startApplet(context, "appId")
·Java
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this, "appId");

1.2.2 普通打开小程序时携带启动参数

API
/**
 * 启动小程序
 *
 * @param context 上下文
 * @param appId 小程序id
 * @param startParams 启动小程序时携带的参数
 */
fun startApplet(context: Context, appId: String, startParams: Map<String, String>)
调用示例
·Kotlin
val params = HashMap<String, String>()
// path为小程序页面路径
params["path"] = "/pages/index/index"
// query为启动参数,内容为"key1=value1&key2=value2 ..."的形式
params["query"] = "aaa=\"test\"&bbb=\"123\""
FinAppClient.appletApiManager.startApplet(this, "appId", params)
·Java
Map<String, String> params = new HashMap<>();
// path为小程序页面路径
params.put("path", "/pages/index/index");
// query为启动参数,内容为"key1=value1&key2=value2 ..."的形式
params.put("query", "aaa=\"test\"&bbb=\"123\"");
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this, "appId", params);

1.2.3 普通打开小程序时携带服务器信息和启动参数

API
/**
 * 启动小程序
 *
 * @param context 上下文
 * @param apiServer 小程序所在应用市场的服务器地址
 * @param appId 小程序id
 * @param sequence 小程序开发版本号
 * @param startParams 启动小程序时携带的参数
 */
fun startApplet(context: Context, apiServer: String, appId: String, sequence: Int? = null, startParams: FinAppInfo.StartParams? = null)
调用示例
·Kotlin
FinAppClient.appletApiManager.startApplet(this,  "https://finclip.com","finclip",null,FinAppInfo.StartParams("/pages/tweet/tweet","aaa=\"test\"&bbb=\"123\"",""))
·Java
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this,  "https://finclip.com","finclip",null, new FinAppInfo.StartParams("/pages/tweet/tweet","aaa=\"test\"&bbb=\"123\"",""));

1.2.4 加密信息打开小程序

通过加密信息打开小程序,包括线上版、体验版、临时版(IDE预览版)、审核版、开发版等,需要先扫描小程序平台上的二维码,得到二维码里的内容,然后取二维码里的info(即加密信息)调用该接口打开小程序。打开体验版、审核版等需要运营后台配置用户权限。

以体验版为例,可参考Android 常见问题-是否支持打开体验版小程序? (opens new window)

API
/**
 * 启动小程序
 *
 * @param context 上下文
 * @param startAppletDecryptRequest 请求体
 */
fun startApplet(context: Context, startAppletDecryptRequest: StartAppletDecryptRequest)

StartAppletDecryptRequest结构如下:

/**
 * 启动小程序请求实体类
 *
 * @param info 小程序加密信息
 */
data class StartAppletDecryptRequest(val info: String)
调用示例
·Kotlin
FinAppClient.appletApiManager.startApplet(
    this,
    StartAppletDecryptRequest(        "y/jtyRN5HMFIJOoTpL+GPLCqh2xUBzZQPfnRIKYBQXHq7W7n6xueTXUtKcbjsjAIz0cGjj0Ne4fcchBRCmJO+As0XFqMrOclsqrXaogsaUOfv+Co/r96qtXEmT529qqdHeSLBnDEunpZL5zYFzDKevbGq1IkuCtF5MJ4+Mv5gXT1kdgooEuOV7SCBrakuEQkXwuMGKoSoVCEEkUG0V6CNM9IW+Ea5PjJxHU5MzPBp8BJF6Q8r9P86MJuOvKjlVwhhjtfJeUBJKSiOPqr3SmzpQ=="
    )
)
·Java
FinAppClient.INSTANCE.getAppletApiManager().startApplet(
        this,
        new StartAppletDecryptRequest(                "y/jtyRN5HMFIJOoTpL+GPLCqh2xUBzZQPfnRIKYBQXHq7W7n6xueTXUtKcbjsjAIz0cGjj0Ne4fcchBRCmJO+As0XFqMrOclsqrXaogsaUOfv+Co/r96qtXEmT529qqdHeSLBnDEunpZL5zYFzDKevbGq1IkuCtF5MJ4+Mv5gXT1kdgooEuOV7SCBrakuEQkXwuMGKoSoVCEEkUG0V6CNM9IW+Ea5PjJxHU5MzPBp8BJF6Q8r9P86MJuOvKjlVwhhjtfJeUBJKSiOPqr3SmzpQ=="
        )
);

请注意

打开小程序时,加密信息串info由后端接口生成,具体使用可以根据场景设计获取。

1.3 关闭小程序

由于SDK使用多进程的方式加载小程序,该API并不会真正结束小程序,而是将小程序移至系统后台。

1.3.1 关闭单个小程序

API
/**
 * 关闭小程序
 *
 * @param appId 小程序id
 */
fun closeApplet(appId: String)
调用示例
·Kotlin
FinAppClient.appletApiManager.closeApplet("appId")
·Java
FinAppClient.INSTANCE.getAppletApiManager().closeApplet(appId);

1.3.2 关闭所有小程序

API
/**
 * 关闭所有小程序
 */
fun closeApplets()
调用示例
·Kotlin
FinAppClient.appletApiManager.closeApplets()
·Java
FinAppClient.INSTANCE.getAppletApiManager().closeApplets();

1.4 结束小程序

1.4.1 结束单个小程序

API
/**
 * 结束正在运行的小程序
 *
 * @param appId 小程序id
 */
fun finishRunningApplet(appId: String)
调用示例
·Kotlin
FinAppClient.appletApiManager.finishRunningApplet("appId")
·Java
FinAppClient.INSTANCE.getAppletApiManager().finishRunningApplet("appId");

1.4.2 结束所有小程序

API
/**
 * 结束所有正在运行的小程序
 */
fun finishAllRunningApplets()
调用示例
·Kotlin
FinAppClient.appletApiManager.finishAllRunningApplets()
·Java
FinAppClient.INSTANCE.getAppletApiManager().finishAllRunningApplets();

1.5 删除小程序

由于会将小程序包和小程序信息缓存在本地,以后打开时速度会非常快。

所以,如果想要将小程序的所有信息都删除,那么可以调用以下api删除某个小程序或者删除所有小程序,删除的内容包括小程序本体、数据库、文件等。

1.5.1 删除单个小程序

API
/**
 * 移除使用过的小程序
 *
 * @param appId 小程序id
 */
fun removeUsedApplet(appId: String)
调用示例
·Kotlin
FinAppClient.appletApiManager.removeUsedApplet("appId")
·Java
FinAppClient.INSTANCE.getAppletApiManager().removeUsedApplet("appId");

1.5.2 删除所有小程序

API
/**
 * 清除所有小程序相关数据(数据库、文件等)
 */
fun clearApplets()
调用示例
·Kotlin
FinAppClient.appletApiManager.clearApplets()
·Java
FinAppClient.INSTANCE.getAppletApiManager().clearApplets();

1.6 搜索小程序

要搜索小程序,需要两步:

  1. 确保在初始化SDK的时候,配置了该服务器信息;
  2. 调用该搜索接口搜索小程序

API

/**
 * 搜索小程序
 *
 * @param searchAppletRequest 请求体
 * @param callback 请求结果回调
 */
fun searchApplet(
    searchAppletRequest: SearchAppletRequest,
    callback: FinCallback<SearchAppletResponse>
)

SearchAppletRequest说明:

/**
 * 搜索小程序请求实体类
 *
 * @param apiServer 服务器地址
 * @param text 搜索内容
 */
data class SearchAppletRequest(var apiServer: String,
                               var text: String)

SearchAppletResponse说明:

/**
 * 搜索小程序返回实体类
 *
 * @param list 搜索到的小程序集合
 * @param total 搜索到的小程序数量
 */
data class SearchAppletResponse(
        val list: List<AppletInfo>?,
        val total: Int
)

/**
 * 搜索小程序返回的小程序信息实体类
 *
 * @param appId 小程序id
 * @param appName 小程序名称
 * @param desc 小程序描述信息
 * @param highLights 高亮字体
 * @param logo 小程序logo
 * @param organName 企业名称
 * @param pageUrl 小程序搜索到的页面路径
 * @param showText 展示内容
 */
data class AppletInfo(
        val appId: String?,
        val appName: String?,
        val desc: String?,
        val highLights: List<HighLight>?,
        val logo: String?,
        val organName: String?,
        val pageUrl: String?,
        val showText: String?
)

/**
 * 高亮字体
 *
 * @param key 高亮字体的key
 * @param value 高亮字体的value
 */
data class HighLight(
        val key: String?,
        val value: String?
)

调用示例

·Kotlin
FinAppClient.appletApiManager.searchApplet(
    SearchAppletRequest("服务地地址", "搜索内容"),
    object : FinCallback<SearchAppletResponse> {
        override fun onSuccess(result: SearchAppletResponse?) {
            // 搜索成功
        }

        override fun onError(code: Int, error: String?) {
            // 搜索失败
        }

        override fun onProgress(status: Int, info: String?) {
        }
    })
·Java
FinAppClient.INSTANCE.getAppletApiManager().searchApplet(
        new SearchAppletRequest("服务器地址", "搜索内容"),
        new FinCallback<SearchAppletResponse>() {
            @Override
            public void onSuccess(SearchAppletResponse result) {
                // 搜索成功
            }

            @Override
            public void onError(int code, String error) {
                // 搜索失败
            }

            @Override
            public void onProgress(int status, String info) {

            }
        });

1.7 获取小程序对象信息

API

/**
 * 获取小程序信息
 */
fun getAppletInfo(appId: String): FinAppInfo?

调用示例

·Kotlin
val appInfo = FinAppClient.appletApiManager.getAppletInfo("appId")
·Java
FinAppInfo appInfo = FinAppClient.INSTANCE.getAppletApiManager().getAppletInfo("appId"); 

相关字段说明

字段名说明
appId小程序id
codeId小程序代码包ID
userId小程序开发者id
appAvatar小程序头像
appTitle小程序标题
appDescription小程序描述
appPath小程序路径
appVersion小程序版本号
appVersionDescription小程序版本说明
sequence小程序序列
isGrayVersion是否是灰度版本
appThumbnail小程序缩略图
groupId所属组织ID
groupName所属组织名称
appType小程序类型
createdBy小程序开发者
createdTime小程序创建时间
startParams启动参数
info扩展信息
fromAppId小程序的来源小程序id
如果小程序A通过调用navigateToMiniProgram打开小程序B,那么对于小程序B来说,fromAppId为小程序A的appId
finStoreConfig小程序应用市场配置信息
frameworkVersion基础库版本号
url小程序下载地址
md5小程序整包MD5
cryptInfo小程序加密信息

1.8 获取小程序当前WebView信息

1.8.1 获取当前webView的URL

FinAppClient.appletApiManager.getCurrentWebViewURL(
    object : FinCallback<String> {
        override fun onSuccess(result: String?) {
            toast("url:$result")
        }

        override fun onError(code: Int, error: String?) {

        }

        override fun onProgress(status: Int, info: String?) {

        }
    })

1.8.2 获取当前webView的UserAgent

FinAppClient.appletApiManager.getCurrentWebViewUserAgent(
    object : FinCallback<String> {
        override fun onSuccess(result: String?) {
            toast("userAgent:$result")
        }

        override fun onError(code: Int, error: String?) {

        }

        override fun onProgress(status: Int, info: String?) {

        }
    })

1.9 获取小程序页面截图

API

/**
 * 获取小程序页面截图
 *
 * @param appId 小程序id
 * @param callback 小程序页面截图回调
 */
fun captureAppletPicture(appId: String, callback: FinCallback<Bitmap?>)

调用示例

·Kotlin
FinAppClient.appletApiManager.captureAppletPicture(
    "appId",
    object : FinCallback<Bitmap?> {
        override fun onSuccess(result: Bitmap?) {
            Log.d(TAG, "获取小程序页面截图成功 :$result")
        }

        override fun onError(code: Int, error: String?) {
            Log.e(TAG, "获取小程序页面截图失败 :$code, $error")
        }

        override fun onProgress(status: Int, info: String?) {
        }
    })
·Java
FinAppClient.INSTANCE.getAppletApiManager().captureAppletPicture(
        "appId",
        new FinCallback<Bitmap>() {
            @Override
            public void onSuccess(Bitmap result) {
                Log.d(TAG, "获取小程序页面截图成功 :" + bitmap);
            }

            @Override
            public void onError(int code, String error) {
                Log.e(TAG, "获取小程序页面截图失败 :" + code + ", " + error);
            }

            @Override
            public void onProgress(int status, String info) {

            }
        });

1.10 获取使用过的小程序

1.10.1 获取使用过的单个小程序

API
/**
 * 获取指定小程序id的使用过的小程序
 *
 * @param appId 小程序id
 */
fun getUsedApplet(appId: String): FinApplet?
调用示例
·Kotlin
val finApplet = FinAppClient.appletApiManager.getUsedApplet("appId") 
·Java
FinApplet finApplet = FinAppClient.INSTANCE.getAppletApiManager().getUsedApplet("appId"); 

1.10.2 获取使用过的小程序列表

API
/**
 * 获取所有使用过的小程序
 */
fun getUsedApplets(): List<FinApplet>
调用示例
·Kotlin
val usedApplets = FinAppClient.appletApiManager.getUsedApplets() 
·Java
List<FinApplet> usedApplets = FinAppClient.INSTANCE.getAppletApiManager().getUsedApplets(); 

1.11 微信小程序二维码信息转换为FinClip小程序

该API的使用场景比较特别,当某小程序在微信和FinClip服务上都上架之后,可以在FinClip平台关联微信的小程序。这时FinClip平台上的线上版二维码,既可以用微信扫码打开,也可以用凡泰助手或其他集成了FinClip SDK的APP扫码打开。

流程是先扫描该二维码,得到二维码内容,然后调用该接口获取FinClip 小程序id,最后调用打开小程序的API即可。

API

/**
 * 根据微信QrCode信息解析小程序信息
 *
 * @param qrCode 二维码信息
 * @param apiServer 小程序所在应用市场的服务器地址
 * @param callback 结果回调
 */
fun parseAppletInfoFromWXQrCode(
    qrCode: String,
    apiServer: String,
    callback: FinSimpleCallback<ParsedAppletInfo?>
)

ParsedAppletInfo结构如下:

/**
 * 根据微信QrCode信息解析小程序信息返回的小程序信息实体类
 *
 * @param appId 小程序id
 */
data class ParsedAppletInfo(
    val appId: String?
)

调用示例

Kotlin
FinAppClient.appletApiManager.parseAppletInfoFromWXQrCode(
    qrCode,
    apiServer,
    object : FinSimpleCallback<ParsedAppletInfo?>() {
        override fun onSuccess(result: ParsedAppletInfo?) {
            Log.d(TAG, "parse onSuccess result : ${result.toString()}")
        }

        override fun onError(code: Int, error: String?) {
            Log.d(TAG, "parse onError code : $code, error : $error")
        }
    })
Java
FinAppClient.INSTANCE.getAppletApiManager().parseAppletInfoFromWXQrCode(
        qrCode,
        apiServer,
        new FinSimpleCallback<ParsedAppletInfo>() {
            @Override
            public void onSuccess(ParsedAppletInfo result) {
                Log.d(TAG, "parse onSuccess result : " + result.toString());
            }

            @Override
            public void onError(int code, @org.jetbrains.annotations.Nullable String error) {
                Log.d(TAG, "parse onError code : " + code + ", error : " + error);
            }
        }
);

1.12 代理方法

小程序的部分功能,需要原生端去实现才能调用,比如转发和获取主体App的用户信息等。

这些代理方法都声明在[IAppletHandler]抽象类中。

API

/**
 * 设置[IAppletHandler]的实现类
 *
 * @param appletHandler [IAppletHandler]的实现类
 */
fun setAppletHandler(appletHandler: IAppletHandler)

调用示例

·Kotlin
FinAppClient.appletApiManager.setAppletHandler(
    object : IAppletHandler {
        override fun shareAppMessage(
            appInfo: String,
            bitmap: Bitmap?,
            callback: IAppletHandler.IAppletCallback
        ) {

        }
    })
·Java
FinAppClient.INSTANCE.getAppletApiManager().setAppletHandler(new IAppletHandler() {
    @Override
    public void shareAppMessage(@NotNull String appInfo,
                                @Nullable Bitmap bitmap,
                                @NotNull IAppletCallback callback) {

    }
});

1.13 获取小程序临时文件存储目录的路径

API

/**
 * 获取小程序临时文件存储目录的路径
 *
 * @param context 上下文
 * @param appId 小程序ID
 * @return 小程序临时文件存储目录的路径
 */
fun getAppletTempPath(context: Context, appId: String): String?

调用示例

·Kotlin
val appletTempPath = FinAppClient.appletApiManager.getAppletTempPath(this, "appId")
·Java
String appletTempPath = FinAppClient.INSTANCE.getAppletApiManager().getAppletTempPath(this, "appId");

1.14 获取小程序源码存储目录的路径

API

/**
 * 获取小程序源码存储目录的路径
 *
 * @param context 上下文
 * @param appId 小程序ID
 * @return 小程序源码存储目录的路径
 */
fun getAppletSourcePath(context: Context, appId: String): String?

调用示例

·Kotlin
val appletSourcePath = FinAppClient.appletApiManager.getAppletSourcePath(context, "appId")
·Java
String appletSourcePath = FinAppClient.INSTANCE.getAppletApiManager().getAppletSourcePath(context, appId);

1.15 设置小程序Activity的切换动画

API

/**
 * 设置小程序Activity的切换动画
 *
 * @param anim [Anim]动画
 */
fun setActivityTransitionAnim(anim: Anim)

调用示例

·Kotlin
FinAppClient.appletApiManager.setActivityTransitionAnim(SlideFromRightToLeftAnim)
·Java
FinAppClient.INSTANCE.getAppletApiManager().setActivityTransitionAnim(SlideFromRightToLeftAnim.INSTANCE);

1.16 原生发送事件给小程序

API

/**
 * 原生发送事件给小程序
 * @param appId
 * @param params 事件参数
 */
fun sendCustomEvent(appId: String, params: String)

调用示例

·Kotlin
FinAppClient.appletApiManager.sendCustomEvent("app", "{\"test\":\"123\"}")
·Java
FinAppClient.INSTANCE.getAppletApiManager().sendCustomEvent("app", "{\"test\":\"123\"}")

1.17 设置[IAppletLifecycleCallback]

API

/**
 * 设置[IAppletLifecycleCallback]
 *
 * @param appletLifecycleCallback [IAppletLifecycleCallback]对象
 */
fun setAppletLifecycleCallback(appletLifecycleCallback: IAppletLifecycleCallback)

调用示例

·Kotlin
FinAppClient.appletApiManager.setAppletLifecycleCallback(object : IAppletLifecycleCallback {
    override fun onStart(appId: String) {
        Log.d(TAG, "IAppletLifecycleCallback onStart : $appId")
    }

    override fun onResume(appId: String) {
        Log.d(TAG, "IAppletLifecycleCallback onResume : $appId")
    }

    override fun onPause(appId: String) {
        Log.d(TAG, "IAppletLifecycleCallback onPause : $appId")
    }

    override fun onStop(appId: String) {
        Log.d(TAG, "IAppletLifecycleCallback onStop : $appId")
    }
})
·Java
FinAppClient.INSTANCE.getAppletApiManager().setAppletLifecycleCallback(new IAppletLifecycleCallback() {

    @Override
    public void onStart(@NotNull String appId) {
        Log.d(TAG, "IAppletLifecycleCallback onStart : " + appId);
    }

    @Override
    public void onResume(@NotNull String appId) {
        Log.d(TAG, "IAppletLifecycleCallback onResume : " + appId);
    }

    @Override
    public void onPause(@NotNull String appId) {
        Log.d(TAG, "IAppletLifecycleCallback onPause : " + appId);
    }

    @Override
    public void onStop(@NotNull String appId) {
        Log.d(TAG, "IAppletLifecycleCallback onStop : " + appId);
    }
});

1.18 创建一个[FinAppletWebView]实例

改方法已于2.12.4版本废弃,若需要用到FinAppletWebView,直接实例化该类即可。

API

/**
 * 创建一个[FinAppletWebView]实例
 *
 * @param context [Context]对象
 * @return 一个[FinAppletWebView]实例
 */
fun createFinAppletWebView(context: Context): FinAppletWebView

调用示例

·Kotlin
val finAppletWebView = FinAppClient.appletApiManager.createFinAppletWebView(this)
·Java
FinAppletWebView finAppletWebView = FinAppClient.INSTANCE.getAppletApiManager().createFinAppletWebView(context);

1.19 获取当前小程序的id

API

/**
 * 获取当前小程序的id
 */
fun getCurrentAppletId(): String?

调用示例

·Kotlin
val currentAppletId = FinAppClient.appletApiManager.getCurrentAppletId() 
·Java
String currentAppletId = FinAppClient.INSTANCE.getAppletApiManager().getCurrentAppletId(); 

1.20 判断是否是使用过的小程序

API

/**
 * 判断是否是使用过的小程序
 */
fun isUsedApplet(appId: String): Boolean

调用示例

·Kotlin
val isUsedApplet = FinAppClient.appletApiManager.isUsedApplet("appId") 
·Java
boolean isUsedApplet = FinAppClient.INSTANCE.getAppletApiManager().isUsedApplet("appId"); 

1.21 跨进程调用接口

1.21.1 主进程调用小程序进程

调用 需要在主进程调用

FinAppClient.appletApiManager.callInAppletProcess(
        FinAppClient.appletApiManager.getCurrentAppletId().orEmpty(),
        "主进程调用小程序进程方法名",
        "主进程调用小程序进程参数",
        object : FinCallback<String> {
            override fun onSuccess(result: String?) {
                toast("小程序进程返回的结果:$result")
            }

            override fun onError(code: Int, error: String?) {

            }

            override fun onProgress(status: Int, info: String?) {

            }
        })

接收 需要在小程序进程注册处理方法 可通过FinAppClient.isFinAppProcess(context)判断是否是小程序进程

if (FinAppClient.isFinAppProcess(this)) {
    FinAppProcessClient.appletProcessApiManager.setMainProcessCallHandler(
        object : IAppletProcessApiManager.MainProcessCallHandler {
            override fun onMainProcessCall(
                name: String,
                params: String?,
                callback: IApiCallback?
            ) {
                toast("主进程调用小程序进程:name:$name,params:$params")
                callback?.onSuccess("返回结果给主进程")
            }
        })
}

1.21.2 小程序进程调用主进程

调用 需要在小程序进程调用

FinAppProcessClient.appletProcessApiManager.callInMainProcess(
    "小程序进程调用主进程的方法名",
    "小程序进程调用主进程的参数",
    object : FinCallback<String> {
        override fun onSuccess(result: String?) {
            toast("小程序进程调用主进程成功:$result")
        }

        override fun onError(code: Int, error: String?) {

        }

        override fun onProgress(status: Int, info: String?) {

        }
    })

接收 需要在主进程注册处理方法

FinAppClient.appletApiManager.setAppletProcessCallHandler(
    object : IAppletApiManager.AppletProcessCallHandler {
        override fun onAppletProcessCall(
            name: String,
            params: String?,
            callback: IApiCallback?
        ) {
            application.toast("小程序进程调用主进程:name:$name,params:$params")
            callback?.onSuccess("返回结果给小程序进程")
        }
    })

1.22 在小程序进程调用api

FinAppClient.appletApiManager只能在主进程中使用

在小程序进程中要使用FinAppProcessClient.appletProcessApiManager之中的方法。

 FinAppProcessClient.appletProcessApiManager.getCurrentAppletId()

 FinAppProcessClient.appletProcessApiManager.getAppletInfo()

 FinAppProcessClient.appletProcessApiManager.sendCustomEvent(params)

1.23 设置最大可运行的小程序个数

该接口可以设置最大可运行的小程序个数,当打开的小程序超过最大可运行个数时,最先打开的小程序会被回收。

注意

最大可运行的小程序个数默认为5个,可设置的范围为1-5,设置<=0或>5的数字不生效

val config = FinAppConfig.Builder()
    .setSdkKey("SDK Key")
    .setSdkSecret("SDK Secret")
    .setMaxRunningApplet(3) //设置最大可运行的小程序个数
    .build()

FinAppClient.init(application, config, object : FinCallback<Any?> {})

1.24 设置前台服务保持app运行

当打开小程序后,app进入后台运行。这时app可能会被系统杀死。可以配置通过启动前台服务一直保持app运行而不被系统杀死

val config = FinAppConfig.Builder()
    .setSdkKey(BuildConfig.SDK_KEY)
    .setSdkSecret(BuildConfig.SDK_SECRET)
    .setForegroundServiceConfig(
        FinAppConfig.ForegroundServiceConfig(
            true, //是否开启前台服务
            R.drawable.ic_launcher, //前台服务的icon
            "小程序正在运行", // 前台服务的标题
            "",
            notificationChannelId, // 通知channelId
            notificationChannelName, // 通知channel名称
            notificationChannelDesc, // 通知channel介绍
        )
    )
    .build()

FinAppClient.init(application, config, object : FinCallback<Any?> {})

1.25 设置当主进程关闭的时候小程序进程也关闭

默认情况下,当app主进程关闭的时候,小程序依然可以独立运行。可以配合当app进程关闭或被杀死的时候小程序进程也被关闭

val config = FinAppConfig.Builder()
                .setSdkKey(BuildConfig.SDK_KEY)
                .setSdkSecret(BuildConfig.SDK_SECRET)
                .setBindAppletWithMainProcess(true) //当主进程关闭的时候小程序进程也关闭
                .setKillAppletProcessNotice("APP已被关闭,小程序无法单独使用,请您重新打开APP再使用小程序。")
                .build()

FinAppClient.init(application, config, object : FinCallback<Any?> {})

1.26 配置小程序右上角胶囊样式

val uiConfig = UIConfig()
uiConfig.setCapsuleConfig(CapsuleConfig())

胶囊配置属性介绍

public static class CapsuleConfig {
    /**
     *  右上角胶囊视图的宽度,默认值为88
     *  
     */
    public float capsuleWidth = 88;
    /**
     *  右上角胶囊视图的高度,默认值为32
     *  
     */
    public float capsuleHeight = 32;
    /**
     * 右上角胶囊视图的右边距
     */
    public float capsuleRightMargin = 7;
    /**
     *  右上角胶囊视图的圆角半径,默认值为5
     *  
     */
    public float capsuleCornerRadius = 5;
    /**
     *  右上角胶囊视图的边框宽度,默认值为0.8
     *  
     */
    public float capsuleBorderWidth = 1f;
    /**
     * 胶囊背景颜色浅色
     */
    public int capsuleBgLightColor = 0x33000000;
    /**
     * 胶囊背景颜色深色
     */
    public int capsuleBgDarkColor = 0x80ffffff;
    /**
     *  右上角胶囊视图的边框浅色颜色
     *  
     */
    public int capsuleBorderLightColor = 0x80ffffff;
    /**
     *  右上角胶囊视图的边框深色颜色
     *  
     */
    public int capsuleBorderDarkColor = 0x26000000;
    /**
     * 胶囊分割线浅色颜色
     */
    public int capsuleDividerLightColor = 0x80ffffff;
    /**
     * 胶囊分割线深色颜色
     */
    public int capsuleDividerDarkColor = 0x26000000;
    /**
     *  胶囊里的浅色更多按钮的图片对象,如果不传,会使用默认图标
     *  
     */
    public int moreLightImage = R.drawable.miniapps_mor
    /**
     *  胶囊里的深色更多按钮的图片对象,如果不传,会使用默认图标
     *  
     */
    public int moreDarkImage = R.drawable.miniapps_more
    /**
     *  胶囊里的更多按钮的宽度,高度与宽度相等
     *  
     */
    public float moreBtnWidth = 32;
    /**
     *  胶囊里的更多按钮的左边距
     *  
     */
    public float moreBtnLeftMargin = 6;
    /**
     *  胶囊里的浅色更多按钮的图片对象,如果不传,会使用默认图标
     *  
     */
    public int closeLightImage = R.drawable.miniapps_cl
    /**
     *  胶囊里的深色更多按钮的图片对象,如果不传,会使用默认图标
     *  
     */
    public int closeDarkImage = R.drawable.miniapps_clo
    /**
     *  胶囊里的关闭按钮的宽度,高度与宽度相等
     *  
     */
    public float closeBtnWidth = 32;
    /**
     *  胶囊里的关闭按钮的左边距
     *  
     */
    public float closeBtnLeftMargin = 6;
}

配置胶囊示例

uiConfig.capsuleConfig.apply {
    capsuleWidth = 86f
    capsuleHeight = 31f
    capsuleRightMargin = 15f
    capsuleCornerRadius = 15.5f
    capsuleBorderWidth = 0.5f
    capsuleBgLightColor = Color.TRANSPARENT
    capsuleBgDarkColor = Color.TRANSPARENT
    capsuleBorderLightColor = Color.parseColor("#88ffffff")
    capsuleBorderDarkColor = Color.parseColor("#a5a9b4")
    moreLightImage = R.drawable.more_light
    moreDarkImage = R.drawable.more_dark
    moreBtnWidth = 25f
    moreBtnLeftMargin = 11f
    closeLightImage = R.drawable.close_light
    closeDarkImage = R.drawable.close_dark
    closeBtnWidth = 25f
    closeBtnLeftMargin = 9f
    capsuleDividerLightColor = Color.parseColor("#88ffffff")
    capsuleDividerDarkColor = Color.parseColor("#a5a9b4")
}

2. 高级API

2.1 注册自定义API

如果小程序里需要调用一些宿主app提供的能力,而FinClip SDK未实现或无法实现时,就可以注册一些自定义API。然后小程序里就可以像调用其他API一样调用注册的API了。

注册自定义API分两个场景:1.注册给原生小程序使用的自定义API;2.注册给小程序中web-view组件加载的H5使用的自定义API。

2.1.1 注册小程序API

自定义api示例
public class CustomApi extends BaseApi {

    public CustomApi(Context context) {
        super(context);
    }

    @Override
    public String[] apis() {
        return new String[]{"customEvent"}; //api名称
    }

    @Override
    public void invoke(String event, JSONObject param, ICallback callback) {
        // 调用方法时原生对应的操作
    }
}

然后将其注册到extensionApiManager中,支持单个注册和批量注册。

·Kotlin
单个注册
FinAppClient.extensionApiManager.registerApi(CustomApi(this)) 
批量注册
val apis = listOf<IApi>(CustomApi1(), CustomApi2(), CustomApi3())
FinAppClient.extensionApiManager.registerApis(apis) 
·Java
单个注册
FinAppClient.INSTANCE.getExtensionApiManager().registerApi(new CustomApi(this)); 
批量注册
List<IApi> apis = new ArrayList<>();

IApi customApi1 = new CustomApi1();
apis.add(customApi1);

IApi customApi2 = new CustomApi2();
apis.add(customApi2);

IApi customApi3 = new CustomApi3();
apis.add(customApi3);

FinAppClient.INSTANCE.getExtensionApiManager().registerApis(apis); 
在小程序中使用自定义api

在小程序中使用自定义api只需要两步:

  1. 在小程序根目录创建FinClipConf.js并进行相应的自定义api配置
  2. 在小程序中调用自定义api

FinClipConf.js的配置如下:

module.exports = {
  extApi:[
    { //普通交互API
      name: 'customEvent', //扩展api名 该api必须Native方实现了
      params: { //扩展api 的参数格式,可以只列必须的属性
        url: ''
      }
    },
    {
        name: 'customEvent1',
        params: {
            foo: ''
        }
    },
    {
        // foo
    }
  ]
}

在小程序中,调用自定义api的方法如下:

ft.customEvent({
    url:'https://www.xxx.com',
    success: function (res) {
        console.log("customEvent call succeeded");
        console.log(res)
    },
    fail: function (res) {
        console.log("customEvent call failed");
        console.log(res)
    }
})

2.1.2 注册小程序web-view组件API

小程序里加载的H5,如果也想调用宿主API的某个能力,就可以利用该方法注册一个API。

自定义api示例
public class WebApi extends BaseApi {

    public WebApi(Context context) {
        super(context);
    }

    @Override
    public String[] apis() {
        return new String[]{"webApiName"}; //api名称
    }

    @Override
    public void invoke(String event, JSONObject param, ICallback callback) {
        // 调用方法时原生对应的操作
    }
}

然后将其注册到extensionWebApiManager中,支持单个注册和批量注册。

·Kotlin
单个注册
FinAppClient.extensionWebApiManager.registerApi(WebApi(this)) 
批量注册
val apis = listOf<IApi>(WebApi1(), WebApi2(), WebApi3())
FinAppClient.extensionWebApiManager.registerApis(apis)
·Java
单个注册
FinAppClient.INSTANCE.getExtensionWebApiManager().registerApi(new WebApi(this)); 
批量注册
List<IApi> apis = new ArrayList<>();

IApi webApi1 = new WebApi1();
apis.add(webApi1);

IApi webApi2 = new WebApi2();
apis.add(webApi2);

IApi webApi3 = new WebApi3();
apis.add(webApi3);

FinAppClient.INSTANCE.getExtensionWebApiManager().registerApis(apis); 

2.2 原生调用JS API

API

/**
 * 原生调用JS函数
 *
 * @param appId 小程序id
 * @param funcName JS函数名
 * @param funcParams JS函数参数
 * @param webViewId WebView的id
 * @param callback 回调
 */
fun callJS(appId: String, funcName: String?, funcParams: String?, webViewId: Int, callback: FinCallback<String?>)

调用示例

·Kotlin
FinAppClient.appletApiManager.callJS(
    "appId",
    "funcName",
    "funParams",
    1,
    object : FinCallback<String?> {
        override fun onSuccess(result: String?) {
            Log.d(TAG, "callJS onSuccess : $result")
        }

        override fun onError(code: Int, error: String?) {
            Log.d(TAG, "callJS onError : $code:, $error")
        }

        override fun onProgress(status: Int, info: String?) {
        }
    })
·Java
FinAppClient.INSTANCE.getAppletApiManager().callJS(
        "appId",
        "funcName",
        "funParams",
        1,
        new FinCallback<String>() {
            @Override
            public void onSuccess(String result) {
                Log.d(TAG, "callJS onSuccess : " + result);
            }

            @Override
            public void onError(int code, String error) {
                Log.d(TAG, "callJS onError : " + code + ", " + error);
            }

            @Override
            public void onProgress(int status, String info) {

            }
        });

2.3 注册原生组件

2.3.1 实现INativeView接口

示例
class TestNativeView : INativeView {

    lateinit var eventChannel: INativeView.EventChannel

    /**
     * 创建nativeview
     * @param params 小程序中传来的参数
     * @param eventChannel 用来向小程序组件发送事件
     * @return 创建的view,会填充到小程序里声明组件的位置
     */
    override fun onCreateView(
        context: Context,
        params: ShowNativeViewParams,
        eventChannel: INativeView.EventChannel
    ): View {
        Log.d(TAG, "onCreateView:${params.nativeViewId}")
        this.eventChannel = eventChannel
        return TextView(context).apply {
            gravity = Gravity.CENTER
            setTextColor(Color.RED)
            text = params.params.toString()
            setBackgroundColor(Color.GREEN)
            setOnClickListener {
                eventChannel.send(
                    "test",
                    mapOf("time" to System.currentTimeMillis())
                )
            }
        }
    }

    /**
     * 更新nativeview
     * @param params 小程序中传来的参数
     * @param view 之前创建的view
     */
    override fun onUpdateView(context: Context, params: ShowNativeViewParams, view: View) {
        Log.d(TAG, "onUpdateView:${params.nativeViewId}")
        params.params?.let { (view as TextView).text = it.toString() }
    }


    /**
     * 销毁nativeview
     * @param params 小程序中传来的参数
     * @param view 之前创建的view
     */
    override fun onDestroyView(context: Context, nativeViewId: String, view: View) {
        Log.d(TAG, "onDestroyView:$nativeViewId")
    }

}

2.3.2 注册原生组件

API
/**
 * 注册原生组件
 *
 * @param type 组件类型
 * @param cls 组件实现类 需实现INativeView接口
 */
fun registerNativeView(type: String, cls: Class<out INativeView>)
调用示例
·Kotlin
FinAppClient.nativeViewManager.registerNativeView("video", TestNativeView::class.java) 

2.4 取消注册小程序API

支持单个取消注册和批量取消注册。

调用示例

·Kotlin
单个取消注册
FinAppClient.extensionApiManager.unregisterApi(customApi) 
批量取消注册
FinAppClient.extensionApiManager.unregisterApis(apis) 
·Java
单个取消注册
FinAppClient.INSTANCE.getExtensionApiManager().unregisterApi(customApi); 
批量取消注册
FinAppClient.INSTANCE.getExtensionApiManager().unregisterApis(apis); 

2.5 取消注册小程序web-view组件API

支持单个取消注册和批量取消注册。

调用示例
·Kotlin
单个取消注册
FinAppClient.extensionWebApiManager.unregisterApi(webApi) 
批量取消注册
FinAppClient.extensionWebApiManager.unregisterApis(webApis) 
·Java
单个取消注册
FinAppClient.INSTANCE.getExtensionWebApiManager().unregisterApi(webApi); 
批量取消注册
FinAppClient.INSTANCE.getExtensionWebApiManager().unregisterApis(webApis); 

2.6 获取所有已注册的小程序自定义API

API

/**
 * 获取所有已注册的小程序API
 */
fun getRegisteredApis(): Map<String, IApi>

调用示例

·Kotlin
val apis = FinAppClient.extensionApiManager.getRegisteredApis() 
·Java
Map<String, IApi> apis = FinAppClient.INSTANCE.getExtensionApiManager().getRegisteredApis(); 

2.7 获取所有已注册的小程序web-view API

API

/**
 * 获取所有已注册的网页调用的原生API
 */
fun getRegisteredApis(): Map<String, IApi>

调用示例

·Kotlin
val apis = FinAppClient.extensionWebApiManager.getRegisteredApis() 
·Java
Map<String, IApi> apis = FinAppClient.INSTANCE.getExtensionWebApiManager().getRegisteredApis(); 

2.8 在小程序进程中注册api

正常情况下注册到小程序的api是在主进程调用执行的,当有需要在小程序进程执行的api的时候,需要调用另外的接口去注册。

FinAppProcessClient.callback = object : FinAppProcessClient.Callback {
    override fun getRegisterExtensionApis(activity: Activity): List<IApi>? {
        // 在小程序进程中注册小程序扩展API
        return listOf(CustomApi(activity))
    }

    override fun getRegisterExtensionWebApis(activity: Activity): List<IApi>? {
        // 在小程序进程中注册小程序网页调原生API
        return listOf(CustomH5Api(activity))
    }
}

3. 扩展SDK

扩展SDK 是对核心SDK的补充,所以要使用扩展SDK,也必须依赖核心SDK。 为了保证 SDK 的安全稳定性,将需要权限的API尽可能放到扩展SDK,FinClip 将 SDK 拆分为核心 SDK 与拓展 SDK,后者是前者的补充,因此使用拓展 SDK 也必须依赖核心 SDK。

3.1 集成扩展SDK

implementation 'com.finogeeks.mop:plugins:+'

3.2 小程序API一览

api名称api描述信息
chooseLocation选择位置。
getLocation获取位置信息。
getClipboardData获取剪贴板内容。
setClipboardData设置剪贴板内容。
recorderManager全局唯一的录音管理器

4. 回调接口

4.1 小程序抽象业务回调接口

小程序中部分业务是抽象定义的,这些抽象的业务通过接口的形式暴露给了外部,外部可以自行实现具体的业务逻辑。

所有的抽象业务被定义在IAppletHandler中,应用可以通过调用IAppletApiManagersetAppletHandlerIAppletHandler的实例传给SDK,当业务被触发时,SDK将通过IAppletHandler对应的方法回调给外部,执行外部实现的具体的业务逻辑。

/**
 * 小程序抽象业务回调接口,SDK将这些抽象的业务通过接口的形式暴露给外部,由外部具体实现
 */
interface IAppletHandler {

    interface IAppletCallback {

        /**
         * 成功回调
         */
        fun onSuccess(result: JSONObject? = null)

        /**
         * 失败回调
         */
        fun onFailure()

        /**
         * 取消回调
         */
        fun onCancel()
    }

    /**
     * 转发小程序
     *
     * @param appInfo 小程序信息,是一串json,包含了小程序id、小程序名称、小程序图标、用户id、转发的数据内容等信息。
     * [appInfo]的内容格式如下:
     * {
     *      "appTitle": "凡泰小程序",
     *      "appAvatar": "https:\/\/www.finogeeks.club\/statics\/images\/swan_mini\/swan_logo.png",
     *      "appId": "5df36b3f687c5c00013e9fd1",
     *      "appType": "trial",
     *      "userId": "finogeeks",
     *      "cryptInfo": "SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj0Ne4fcchBRCmJO+As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT",
     *      "params": {
     *           "title": "apt-test-tweet-接口测试发布的动态!@#¥%……&*(",
     *           "desc": "您身边的服务专家",
     *           "imageUrl": "finfile:\/\/tmp_fc15edd8-2ff6-4c54-9ee9-fe5ee034033d1576550313667.png",
     *           "path": "pages\/tweet\/tweet-detail.html?fcid=%40staff_staff1%3A000000.finogeeks.com&timelineId=db0c2098-031e-41c4-b9c6-87a5bbcf681d&shareId=3dfa2f78-19fc-42fc-b3a9-4779a6dac654",
     *           "appInfo": {
     *               "weixin": {
     *                   "path": "\/studio\/pages\/tweet\/tweet-detail",
     *                   "query": {
     *                       "fcid": "@staff_staff1:000000.finogeeks.com",
     *                       "timelineId": "db0c2098-031e-41c4-b9c6-87a5bbcf681d"
     *                    }
     *               }
     *           }
     *       }
     * }
     * [appInfo]中各字段的说明:
     * appId 小程序ID
     * appTitle 小程序名称
     * appAvatar 小程序头像
     * appType 小程序类型,其中trial表示体验版,temporary表示临时版,review表示审核版,release表示线上版,development表示开发版
     * userId 用户ID
     * cryptInfo 小程序加密信息
     * params 附带的其它参数,由小程序自己透传
     *     
     * @param bitmap 小程序封面图片。如果[appInfo].params.imageUrl字段为http、https的链接地址,那么小程序封面图片
     * 就取[appInfo].params.imageUrl对应的图片,否则小程序的封面图片取[bitmap]。
     */
    fun shareAppMessage(appInfo: String, bitmap: Bitmap?, callback: IAppletCallback)

    /**
     * 获取用户信息
     *
     * @return 用户信息[Map]
     */
    fun getUserInfo(): Map<String, String>
    
    /**
     * 获取注册的"更多"菜单项
     *
     * @param appId 小程序ID
     * @return 注册的"更多"菜单项
     */
    fun getRegisteredMoreMenuItems(appId: String): List<MoreMenuItem>?

    /**
     * 注册的"更多"菜单项被点击
     *
     * @param appId 小程序ID
     * @param path 小程序页面路径
     * @param menuItemId 被点击的菜单条目的ID
     * @param appInfo 小程序信息,是一串json,包含了小程序id、小程序名称、小程序图标、用户id、转发的数据内容等信息。
     * [appInfo]的内容格式如下:
     * {
     *      "appTitle": "凡泰小程序",
     *      "appAvatar": "https:\/\/www.finogeeks.club\/statics\/images\/swan_mini\/swan_logo.png",
     *      "appId": "5df36b3f687c5c00013e9fd1",
     *      "appType": "trial",     
     *      "userId": "finogeeks",
     *      "cryptInfo": "SFODj9IW1ENO8OA0El8P79aMuxB1DJvfKenZd7hrnemVCNcJ+Uj9PzkRkf/Pu5nMz0cGjj0Ne4fcchBRCmJO+As0XFqMrOclsqrXaogsaUPq2jJKCCao03vI8rkHilrWxSDdzopz1ifJCgFC9d6v29m9jU29wTxlHsQUtKsk/wz0BROa+aDGWh0rKvUEPgo8mB+40/zZFNsRZ0PjsQsi7GdLg8p4igKyRYtRgOxUq37wgDU4Ymn/yeXvOv7KrzUT",
     *      "params": {
     *           "title": "apt-test-tweet-接口测试发布的动态!@#¥%……&*(",
     *           "desc": "您身边的服务专家",
     *           "imageUrl": "finfile:\/\/tmp_fc15edd8-2ff6-4c54-9ee9-fe5ee034033d1576550313667.png",
     *           "path": "pages\/tweet\/tweet-detail.html?fcid=%40staff_staff1%3A000000.finogeeks.com&timelineId=db0c2098-031e-41c4-b9c6-87a5bbcf681d&shareId=3dfa2f78-19fc-42fc-b3a9-4779a6dac654",
     *           "appInfo": {
     *               "weixin": {
     *                   "path": "\/studio\/pages\/tweet\/tweet-detail",
     *                   "query": {
     *                       "fcid": "@staff_staff1:000000.finogeeks.com",
     *                       "timelineId": "db0c2098-031e-41c4-b9c6-87a5bbcf681d"
     *                    }
     *               }
     *           }
     *       }
     * }
     * [appInfo]中各字段的说明:
     * appId 小程序ID
     * appTitle 小程序名称
     * appAvatar 小程序头像
     * appType 小程序类型,其中trial表示体验版,temporary表示临时版,review表示审核版,release表示线上版,development表示开发版
     * userId 用户ID
     * cryptInfo 小程序加密信息
     * params 附带的其它参数,由小程序自己透传
     *
     * @param bitmap 小程序封面图片。如果[appInfo].params.imageUrl字段为http、https的链接地址,那么小程序封面图片
     * 就取[appInfo].params.imageUrl对应的图片,否则小程序的封面图片取[bitmap]。
     */
    fun onRegisteredMoreMenuItemClicked(appId: String, path: String, menuItemId: String, appInfo: String?, bitmap: Bitmap?, callback: IAppletCallback)
    
    /**
     * 获取灰度发布配置参数
     *
     * @param appId 小程序ID
     * @return 灰度发布配置参数
     */
    fun getGrayAppletVersionConfigs(appId: String): List<GrayAppletVersionConfig>?
    
    /**
     * 小程序导航栏中的"关闭"按钮被点击
     *
     * @param appId 小程序ID
     */
    fun onNavigationBarCloseButtonClicked(appId: String)
}

4.2 小程序生命周期回调接口

外部如果需要监听小程序的生命周期,可以调用IAppletApiManagersetAppletLifecycleCallback接口把IAppletLifecycleCallback的实例传给SDK,当小程序的生命周期发生变化时,SDK会通过IAppletLifecycleCallback对应的方法回调给外部。

/**
 * 小程序生命周期回调接口
 */
interface IAppletLifecycleCallback {

    /**
     * 小程序当前页面状态,与[Activity].[onCreate]对应
     */
    fun onCreate(appId: String)

    /**
     * 小程序当前页面状态,与[Activity].[onStart]对应
     */
    fun onStart(appId: String)

    /**
     * 小程序当前页面状态,与[Activity].[onResume]对应
     */
    fun onResume(appId: String)

    /**
     * 小程序当前页面状态,与[Activity].[onPause]对应
     */
    fun onPause(appId: String)

    /**
     * 小程序当前页面状态,与[Activity].[onStop]对应
     */
    fun onStop(appId: String)

    /**
     * 小程序当前页面状态,与[Activity].[onDestroy]对应
     */
    fun onDestroy(appId: String)
}