在网页中,通常链接的形式如下:
<a href="http://www.baidu.com/">Baidu</a>
这是基于http协议的,由浏览器来根据http协议来具体实现请求和展现。
在手机开发中,有时候会遇到这种情况:某个页面由WebView加载,当点击网页中的某个链接时,希望跳转到用native sdk开发的某个页面去。(比如说手机上第三方应用调用weibo登陆成功后的跳转)
其实就是个网络协议的问题,浏览器监听的是常见的http/https/ftp...协议,我们现在要做的是:
制定一个自己的协议(本例中协议名为:synnex),我们在程序中监听这个协议,当浏览器访问该协议下的某个链接时,会被我们程序拦截到。
一、Android平台的处理方式:
1,html页面:
<a href='synnex://mobile.phonegap?username=test&password=123'>To native page</a>
这种方式更好一点,如果手机上有安装packageid,则打开该应用,否则跳转到google store下载页面。
<a href="intent://mobile.phonegap/#Intent;scheme=synnex;package=packageid;end">To native page</a>
2,AndroidManifest.xml:
<activity android:name=".NativeActivity"> <intent-filter > <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="synnex" android:host="mobile.phonegap"/> </intent-filter> </activity>
3,NativeActivity.java:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.native_page); String username = getIntent().getData().getQueryParameter("username"); String password = getIntent().getData().getQueryParameter("password"); }
二、Blackberry平台的处理方式:
1,html页面同上
2,Screen页面采用BrowserField: (监听我们自定义的协议)
public MyScreen() { BrowserFieldConfig config = new BrowserFieldConfig(); config.setProperty(BrowserFieldConfig.ALLOW_CS_XHR, Boolean.TRUE); config.setProperty(BrowserFieldConfig.JAVASCRIPT_ENABLED, Boolean.TRUE); BrowserField browserField = new BrowserField(config); ProtocolController protocolController = (ProtocolController)browserField.getController(); protocolController.setNavigationRequestHandler("synnex", new BrowserFieldNavigationRequestHandler() { public void handleNavigation(BrowserFieldRequest request) throws Exception { //Logger.info("## " + request.getProtocol() + " , " + request.getURL()); //Dialog.alert(request.getURL()); UiApplication.getUiApplication().pushScreen(new AnotherScreen()); } }); browserField.requestContent("local:///index.html"); add(browserField); }
三、IOS平台的处理方式:
采用UIWebViewDelegate.shouldStartLoadWithRequest