近期因需求需要再次集成微信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..!!!