前段時(shí)間項(xiàng)目需求,集成了支付寶手機(jī)支付功能扔傅,集成過程中一切順利欺劳,禁不住感嘆大廠提供的東西就是給力。然而今天測(cè)試拿手機(jī)過來铅鲤,跟我說手機(jī)未安裝支付寶的時(shí)候,使用H5支付某些按鈕點(diǎn)擊無效枫弟。然后我去看了一下邢享,還真是,但是奇怪的是部分手機(jī)沒有問題淡诗,小部分手機(jī)出現(xiàn)了這個(gè)情況骇塘,同樣一套代碼伊履,怎么會(huì)有兩種區(qū)別這么大的結(jié)果。第一反應(yīng)是想是不是支付寶的包出問題了款违,然后就去支付寶論壇查閱唐瀑,并沒用招到解決的方案。
操作如上圖所示插爹,
情況1:當(dāng)點(diǎn)擊返回按鈕時(shí)哄辣,會(huì)有個(gè)確認(rèn)退出的提示框,測(cè)試點(diǎn)擊"否"是有效的赠尾,但是點(diǎn)擊"是"力穗,則沒用一點(diǎn)相應(yīng)。
情況2:當(dāng)輸入手機(jī)號(hào)結(jié)束后气嫁,點(diǎn)擊下一步当窗,也是任何相應(yīng)都沒有。
最后寸宵,我聯(lián)系上了支付寶的技術(shù)支持工程師崖面,加了釘釘來一起解決問題,當(dāng)時(shí)梯影,他給我拋了這樣一個(gè)鏈接https://tech.open.alipay.com/support/knowledge/index.htm?knowledgeId=201602156692&categoryId=24120#/?_k=p616ot巫员,鏈接中給出了兩個(gè)方案,如下
問題描述與我當(dāng)前碰到的情況相當(dāng)吻合光酣,我立即嘗試了第一種方案疏遏,但是并沒有效果。比較失望的否定了方案一救军,然后看了下方案二财异,要調(diào)用一個(gè)webview的方法,當(dāng)時(shí)第一反應(yīng)是比較懵逼的唱遭,明明調(diào)用的是支付寶的H5Activity戳寸,WebView對(duì)象再那頁面里,我如何去拿到這個(gè)WebView的實(shí)例呢拷泽?難道要集成支付寶提供的H5Activity去做相關(guān)的操作嘛疫鹊?但是這樣操作的話,AndroidManifest.xml文件中的Activity配置就會(huì)對(duì)應(yīng)不上啊司致。就在萬分糾結(jié)的時(shí)候拆吆,我重新閱讀了方案二,一句話敲醒了我脂矫,
pauseTimers是一個(gè)全局方法
全局方法說明是任何WebView實(shí)例去調(diào)用都能生效的枣耀,那等于說我隨便創(chuàng)建一個(gè)WebView對(duì)象調(diào)用一下resumeTimers方法即可?沒錯(cuò)庭再,就是這么簡(jiǎn)單捞奕,
WebView mWebview = new WebView(getApplicationContext());
mWebview.resumeTimers(); // 重點(diǎn)代碼
mWebview.onResume();
// 啟動(dòng)支付寶支付
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PayActivity.this);
Map<String, String> result = alipay.payV2(orderInfo,true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
出現(xiàn)這個(gè)問題的原因是因?yàn)槲业捻?xiàng)目中用到了Activity中使用WebView 的情況牺堰,然后我對(duì)這樣的用法進(jìn)行了封裝,當(dāng)Activity中有WebView的時(shí)候颅围,我會(huì)在Activity生命周期的onResume/onPause中對(duì)webview對(duì)象做相應(yīng)的啟動(dòng)/暫停操作伟葫,提高app執(zhí)行性能。代碼如下
@Override
protected void onResume() {
super.onResume();
if(mWebView != null){
mWebView.resumeTimers();
mWebView.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if(mWebView != null){
mWebView.onPause();
mWebView.pauseTimers();
}
}
離開這樣的Activity的時(shí)候會(huì)調(diào)用WebView的pauseTimers方法院促,導(dǎo)致全局生效筏养,因此使得支付寶H5支付頁面的js無法正常加載運(yùn)行。