編輯:關於Android編程
1.在移動設備訪問m.alipay.com時,如果本地安裝了支付寶客戶端,則浏覽器會調用本地客戶端,沒有安裝則會跳轉到下載頁面,提示安裝。剛好有這樣的需求,就分析了下支付寶的實現。網上參考了其他人的實現,大部分都是關於APK和本地js交互,相關資料可以參考
http://developer.android.com/guide/webapps/webview.html官方的開發指南。
2. APK啟動流程
在啟動APK時,系統會發出對應的intent,根據包名加intent來啟動對應activity,activity如果存在對應的intent-filter則啟動該應用,如果多個應用同時匹配,則會出現選擇框讓用戶選擇。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yOfPwqOsxvS2r2RlbW8udGVzdGpz06bTw7XETWFpbkFjdGl2aXR5PC9wPgo8cD5BY3Rpdml0eU1hbmFnZXIoMzEzKTpTVEFSVHthY3Q9YW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gY2F0PVthbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUl1mbGc9MHgxMDIwMDAwMCBjbXA9ZGVtby50ZXN0anMvLk1haW5BY3Rpdml0eSBibmRzPVsxMyw3Nl1bMTI3LDIxMV19IGZyb20gcGlkNjA3PC9wPgo8cD4gPC9wPgo8cD4zLuSvwMDG97rNsb612EFQS7XEvbu7pTwvcD4KPHA+QW5kcm9pZCBtYW5pZmVzdLHqx6myzr+8udm3vbXEv6q3ota4xM88L3A+CjxwPmh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWludHJvLmh0bWwgPC9wPgo8cD7PwsPmysdVQ7XE0ru49jxpbnRlbnQtZmlsdGVyPjwvcD4KPHA+PGludGVudC1maWx0ZXI+PC9wPgo8cD48YWN0aW9uYW5kcm9pZDpuYW1lPQ=="android.intent.action.VIEW" />
設置
標簽,可以攔截浏覽器的請求,data可以增加過濾的條件。為了防止我們的啟動APK scheme被其它應用攔截,盡量使用唯一的標識符如域名等。
在android應用中application的詳細配置實例:
在MainActivity增加了
"android.intent.action.VIEW"/>
過濾器。
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
android:name="demo.testjs.MainActivity"
android:label="@string/app_name">
"android.intent.action.MAIN"/>
"android.intent.action.VIEW"/>
在web頁面中加入如下測試代碼
測試頁面
"index.jsp"id="openApp"style="display:none">APK客戶端下載鏈接
<scripttype=>
//ios判斷 if(navigator.userAgent.match(/(iPhone|iPod|iPad);?/i))
//判斷是否是android設備浏覽器 if(navigator.userAgent.match(/android/i)) {
if (navigator.userAgent.match(/android/i)) {
document.getElementById('openApp').onclick =function(e) {
// 通過iframe的方式試圖打開APP,如果能正常打開,會直接切換到APP,並自動阻止a標簽的默認行為
// 否則打開a標簽的href鏈接
var ifrSrc ='testjs://platformapi/startApp?name=tom&age=18';
if (!ifrSrc) {
return;
}
var ifr = document.createElement('iframe');
ifr.src = ifrSrc;
ifr.style.display = 'none';
document.body.appendChild(ifr);
setTimeout(function() {
document.body.removeChild(ifr);
}, 1000);
};
if (document.all) {
document.getElementById('openApp').click();
}
// 其它浏覽器
else {
var e = document.createEvent("MouseEvents");
e.initEvent("click",true,true);
document.getElementById("openApp").dispatchEvent(e);
}
}
</script>
新建web工程,加入測試頁面。在手機浏覽器上訪問該頁面,如果本地安裝了對應的APK,則會啟動APK,沒有安裝則跳轉到對應的下載頁面。以上web頁面的腳本從支付寶手機客戶端訪問的頁面截取的。(UC7.8版本的android浏覽器可以下載保存網頁)
4.獲取浏覽器傳遞的值
var ifrSrc = 'testjs://platformapi/startApp?name=tom&age=18';
實例中會提交name和age值
在activity中可以取到通過浏覽器傳遞的值
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(Intent.ACTION_VIEW.equals(getIntent().getAction())){
Intentintent = getIntent();
Stringscheme = intent.getScheme();
Uriuri = intent.getData();
Log.e(tag,"scheme: "+scheme);
Log.e(tag,"path: "+uri.getPath());
Log.e(tag,"Host: "+uri.getHost());
Log.e(tag,"name: "+uri.getQueryParameter("name"));
Log.e(tag,"age: "+uri.getQueryParameter("age"));
}
}
可以取到scheme、 url、參數列表等信息
PS:浏覽器實際上沒有辦法判斷到本地是否安裝了對應的APK文件,支付寶的web前端實現實際上了打開了一個隱藏的url地址,該url如果被本地apk攔截,則啟動本地apk,如果url沒有被攔截,則在1S後刪除添加的'iframe',跳轉到下載頁面。(不管url是否被本地攔截成功,1S後都會跳轉下載頁面,只不過攔截成功,本地APK啟動頁面會遮住浏覽器的下載頁面)
參考其它人用window.location 或 window.open標簽也可以啟動本地APK,但沒有處理url跳轉不存在的問題。(window.open未測試成功)
window.location實現方式:
AndroidManifest.xml配置
"android.intent.action.VIEW"/>
web頁面添加
<scripttype=>
alert("啟動APK");
window.location="testjs://demo.testjs";
</script>
源碼下載:
http://download.csdn.net/detail/qq1761310972/6794481
http://pan.baidu.com/s/1pJk8cmn 在android2.3+tomcat6+win7測試通過
本文實例分析了Android模擬器接收UDP數據包的若干問題。分享給大家供大家參考,具體如下:android模擬器無法接收UDP數據包代碼如下:DatagramPacke
android studio升級到stable 2.2之後,發現還有了個ConstraintLayout。看名字就是約束布局,用各種約束來確定widget的展示。該Con
一.大致效果~別嫌它丑二.關鍵代碼在注釋中講重點吧。(1)Spinner的布局: car_brand_spinner.xml即為彈出來的下拉列表的布局啦,後面的那個布局就
ListView實現的列表,如果是可編輯,可刪除的,一般都要提供批量刪除功能,否則的話,一項一項的刪除體驗很不好,也給用戶帶來了很大的麻煩。 實現效果圖 具體實