三方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
调起微信小程序/打开微信的操作很简单,官方代码示例:
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()
所以不能在onCreat()中获取intent,但是在onResume中也无法获取到使用bundle传输也不行。
如何解决:
方法一:使用EventBus,使用方法略;
方法二:在intent目标activity中添加代码:
protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); }
over..!!!