通过用手机的浏览器(内置,第三方都可)访问一个网页,实现点击一个链接启动自己的应用,并传递数据。

首先在Mainifest文件里面对要启动的Activity添加一个过滤器。


1. <activity  
2. "com.example.helloworld.MainActivity"  
3. "@string/app_name" >  
4.             <intent-filter>  
5. "android.intent.action.MAIN" />  
6.   
7. "android.intent.category.LAUNCHER" />  
8.             </intent-filter>  
9.             <intent-filter>  
10. "android.intent.action.VIEW"/>     
11. "android.intent.category.DEFAULT"/>               
12. "android.intent.category.BROWSABLE"/>  
13. "znn"/>  
14.             </intent-filter>  
15.         </activity>


在MainActivity接收数据:


1. public class MainActivity extends Activity implements View.OnClickListener{  
2.   
3. @Override  
4. protected void onCreate(Bundle savedInstanceState) {  
5. super.onCreate(savedInstanceState);  
6.         setContentView(R.layout.activity_main);  
7.   
8.         Intent intent = getIntent();  
9.         String scheme = intent.getScheme();  
10.         Uri uri = intent.getData();  
11. "scheme:"+scheme);  
12. if (uri != null) {  
13.             String host = uri.getHost();  
14.             String dataString = intent.getDataString();  
15. "d");  
16.             String path = uri.getPath();  
17.             String path1 = uri.getEncodedPath();  
18.             String queryString = uri.getQuery();  
19. "host:"+host);  
20. "dataString:"+dataString);  
21. "id:"+id);  
22. "path:"+path);  
23. "path1:"+path1);  
24. "queryString:"+queryString);  
25.         }  
26.           
27.     }  
28. }



写一个最简单的网页:


1. <a href="znn://aa.bb:80/test?p=12&d=1">test</a>





测试地址:

www.erdian.net/m.html



测试结果:

scheme:znn
 host:aa.bb
 dataString:znn://aa.bb:80/test?p=12&id=1
 id:1
 path:/test
 path1:/test queryString:p=12&d=1

http://www.erdian.net/?p=238


版权声明:本文为博主原创文章,未经博主允许不得转载。

最近,在使用QQ和微信等SDK来实现分享网页的时候,发现,SDK已经为页面跳转回应用提供了基本的数据支持。我们只需在应用里和被分享的网页进行简单的设置,即可实现此功能。

那么我们先来看下网页跳转回应用的实现原理。

就Android平台而言,URI主要分三个部分:scheme, authority and path。其中authority又分为host和port。格式如下: 
scheme://host:port/path 
举个实际的例子: 

content://com.example.project:200/folder/subfolder/etc 
 \---------/  \---------------------------/ \---/ \--------------------------/ 
 scheme                 host               port        path 
                 \--------------------------------/ 
                           authority



现在大家应该知道data flag中那些属性的含义了吧,看下data flag 

<data android:host="string" 
       android:mimeType="string" 
       android:path="string" 
       android:pathPattern="string" 
       android:pathPrefix="string" 
       android:port="string" 
       android:scheme="string" />

以下是测试示例的实现步骤:

1. 新建一个工程A,并实现一个Activity,用来接收外部的跳转。代码如下:



1. public class JumpActivity extends Activity{  
2.   
3.   
4. @Override  
5. protected void onCreate(Bundle savedInstanceState) {  
6. // TODO Auto-generated method stub  
7. super.onCreate(savedInstanceState);  
8.         Intent intent = getIntent();  
9.           
10.         String data = intent.getDataString();  
11.         System.out.println(data);  
12.     }  
13.       
14. }


在这个Activity里,我们可以通过getIntent(),来获取外部跳转传过来的信息。

2.  修改ManiFest文件,设置Activity的接收Action的属性,代码如下:




1. <activity android:name=".JumpActivity" >  
2.     <intent-filter>  
3. "android.intent.action.VIEW" />  
4.   
5.   
6. "android.intent.category.DEFAULT" />  
7. "android.intent.category.BROWSABLE" />  
8.   
9.   
10.         <data  
11. "data"  
12. "sharetest" />  
13.     </intent-filter>  
14. </activity>



如上所示,在data里设置了 scheme和host,则该Activity可以接收和处理类似于 "sharetest://data/XXX"的链接。

3. 接下来我们可以写一个测试工程B,看看工程A中的JumpActivity是否可以接收和处理类似于 "sharetest://data/XXX"的链接。因此,新建一个工程B,工程里只有一个WebView,用来打开一个本地的网页。由于WebView在接收到自己不能处理的Uri时,会自动的调用发送Intent来调用能够处理该Uri的应用。

以下是网页的代码:


1. <!DOCTYPE html>  
2. <html>  
3. <body>  
4. <iframe src="sharetest://data/123" style="display:none"></iframe>  
5. </body>  
6. </html>


将该网页放到Assets目录下,在代码里调用Webview加载该Html文件,代码如下:



1. public void loadHtml()  
2. {  
3. new WebView(this);   
4.     WebSettings wSet = webview.getSettings();   
5. true);  
6. "file:///android_asset/a.html");    
7.     setContentView(webview);  
8. }


4. 将手机装上工程A和工程B。打开工程A,可以发现:工程B的JumpActivity会自动被打开。如下图所示:在Intent中可以去到网页里发出的链接:sharetest://data/123。

因此,我们就可以在JumpActivity里处理接收到的消息了。


scheme 打开设置 scheme打开app_scheme 打开设置

通过以上的4步,相信大家都了解如何让应用接收和处理某种Uri消息。因此,只要我们

1. 在ManiFest里为Activity申明接收并处理某种Uri

2. 在页面中添加以下代码:其中,l为符合Activity处理规则的Uri地址。



1. <iframe src="l" style="display:none"></iframe>

就可以让已安装该应用的用户在打开该网页的时候,自动的跳转到应用内部。

点击微信和QQ分享跳转到程序内部的原理与此一致。