三方App实现和微信小程序交互

      近期因需求需要再次集成微信SDK,在实现app拉起程序的工程中是很顺利的,实现小程序唤醒app时着实被微信光放的文档坑了一把(想必很多人都很头疼微信的开发文档),最后【*】下载了demo看了其实现才搞定小程序唤醒app。下面开始记录一下本次的实现过程:

第三方移动应用拉起电子营业执照小程序,请参考微信开发平台-资源中心-移动应用-移动应用拉起小程序功能,具体详情请查看:https://open.weixin.qq.com/cgi-bin/showdocument? action=dir_list&t=resource/res_list&verify=1&lang=zh_CN 

三方App实现和微信小程序交互

调起微信小程序/打开微信的操作很简单,官方代码示例:

Android开发示例

开发前需下载Android开发工具包(SDK),可在“资源中心-开发资源-资源下载-Android资源下载”按照指引操作。

调用接口:WXLaunchMiniProgram
移动应用跳转到小程序示例:

String appId = "wxd930ea5d5a258f4f"; // 填应用AppId
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);

WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_d43f693ca31f"; // 填小程序原始id
req.path = path; //拉起小程序页面的可带参路径,不填默认拉起小程序首页
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);

回调代码官方文档很坑,下面是我项目中的实现:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static String TAG = "MicroMsg.WXEntryActivity";

    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        api = WXAPIFactory.createWXAPI(this, "wxd930ea5d5a258f4f", false);

        try {
            Intent intent = getIntent();
            api.handleIntent(intent, this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        setIntent(intent);
        api.handleIntent(intent, this);
    }


    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp resp) {
        String extraData = null;
        int type = resp.getType();
        if (type == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
            WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
            extraData = launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
        }
//使用EventBus是因为小程序唤醒app时会回传一些app进入小程序特定功能的操作结果,方便处理回到app后的一系列动作
        EventBus.getDefault().post(extraData);
//        Log.i("extraData", extraData);
//        Toast.makeText(this, extraData + ", type=" + resp.getType(), Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }

}
AndroidManifest:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:launchMode="singleTask"
    android:taskAffinity="net.sourceforge.simcpux"
    android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>

为什么不使用intent传输数据?

答案是如果intent的目的activity的启动模式是默认的(standard)那么进入小程序之前的数据将会被回收,因为activity被重新创建了,如果是启动模式是singleTask时,activity的生命周期是onCreat()-onStart()-onResume()-onPause()-onStop()-onRestart()-onStart()-onResume()

三方App实现和微信小程序交互

所以不能在onCreat()中获取intent,但是在onResume中也无法获取到使用bundle传输也不行。

如何解决:

方法一:使用EventBus,使用方法略;

方法二:在intent目标activity中添加代码:

protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

 

over..!!!