爲什麼寫這篇文章呢?因爲在做App跳轉小程序,小程序返回App這個功能的時候,遇到的坑太多了,所以在這裏記錄一下。無論是微信官方文檔還是google和百度出來的文章,都有坑。
微信官方文檔鏈接地址
TIM截圖20190901175354.png
剛開始看到這個回調說明的時候,我以爲,在WXEntryActivity裏面重寫onResp方法裏面的內容就可以了。接入過微信的朋友應該知道,這個WXEntryActivity如果想要重寫onResp方法,是需要實現IWXAPIEventHandler這個接口。
然後小程序那邊,調用下面的代碼就可以返回App程序了。
<button open-type="launchApp" app-parameter="wechat" binderror="launchAppError" bindtap='openApp'>打開APP</button>
好了,一調試,發現不起作用。點擊小程序的返回App按鈕,App應用程序卡死了,感覺有點懵。
不行的話,那我們繼續看文檔,但是微信官方文檔就是那麼的簡陋,你看不出任何能解決問題的辦法。後面在google的過程中,找到了幾篇文章,綜合了一下其中的內容,最後實現了。感謝這幾篇文章給我的幫助。
文章一
文章二
文章三
下面是我項目中AndroidManifest.xml的配置
<!-- 在AndroidManifest.xml的WXEntryActivity中加入如下屬性:
android:taskAffinity="your packagename"
android:launchMode="singleTask" 保證跳轉後回到你的app的task
這裏如果不加的話,小程序無法跳轉回APP
-->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:taskAffinity="${applicationId}"
android:launchMode="singleTask"/>
下面是我項目中WXEntryActivity中的部分代碼
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
//第三方開發者如果使用透明界面來實現WXEntryActivity,需要判斷handleIntent的返回值
//如果返回值爲false,則說明入參不合法未被SDK處理,應finish當前透明界面,避免外部通過傳遞非法參數的Intent導致停留在透明界面,引起用戶的疑惑
try {
if (!BaseApplication.getInstance().getWeiXinApi().handleIntent(getIntent(), this)) {
finish();
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
BaseApplication.getInstance().getWeiXinApi().handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
Log.d(TAG, "onReq: " + baseReq.getType());
switch (baseReq.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
goToShowMsg((ShowMessageFromWX.Req) baseReq);
break;
default:
break;
}
}
@Override
public void onResp(BaseResp baseResp) {
if (baseResp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) baseResp;
String extraData = launchMiniProResp.extMsg; //對應小程序組件 <button open-type="launchApp"> 中的 app-parameter 屬性
Log.d(TAG, "onResp: " + extraData);
finish(); //需要在小程序返回APP的時候,finish這個頁面,否則其他頁面無法點擊
}
}