Android 通过网页打开自己的APP(scheme)
2015-09-09 11:38
441 查看
通过用手机的浏览器(内置,第三方都可)访问一个网页,实现点击一个链接启动自己的应用,并传递数据。
首先在Mainifest文件里面对要启动的Activity添加一个过滤器。
[java] view
plaincopy
<activity
android:name="com.example.helloworld.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="znn"/>
</intent-filter>
</activity>
在MainActivity接收数据:
[java] view
plaincopy
public class MainActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String scheme = intent.getScheme();
Uri uri = intent.getData();
System.out.println("scheme:"+scheme);
if (uri != null) {
String host = uri.getHost();
String dataString = intent.getDataString();
String id = uri.getQueryParameter("d");
String path = uri.getPath();
String path1 = uri.getEncodedPath();
String queryString = uri.getQuery();
System.out.println("host:"+host);
System.out.println("dataString:"+dataString);
System.out.println("id:"+id);
System.out.println("path:"+path);
System.out.println("path1:"+path1);
System.out.println("queryString:"+queryString);
}
}
}
写一个最简单的网页:
[html] view
plaincopy
<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,用来接收外部的跳转。代码如下:
[java] view
plaincopy
public class JumpActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getDataString();
System.out.println(data);
}
}
在这个Activity里,我们可以通过getIntent(),来获取外部跳转传过来的信息。
2. 修改ManiFest文件,设置Activity的接收Action的属性,代码如下:
[java] view
plaincopy
<activity android:name=".JumpActivity" >
<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:host="data"
android:scheme="sharetest" />
</intent-filter>
</activity>
如上所示,在data里设置了 scheme和host,则该Activity可以接收和处理类似于 "sharetest://data/XXX"的链接。
3. 接下来我们可以写一个测试工程B,看看工程A中的JumpActivity是否可以接收和处理类似于 "sharetest://data/XXX"的链接。因此,新建一个工程B,工程里只有一个WebView,用来打开一个本地的网页。由于WebView在接收到自己不能处理的Uri时,会自动的调用发送Intent来调用能够处理该Uri的应用。
以下是网页的代码:
[html] view
plaincopy
<!DOCTYPE html>
<html>
<body>
<iframe src="sharetest://data/123" style="display:none"></iframe>
</body>
</html>
将该网页放到Assets目录下,在代码里调用Webview加载该Html文件,代码如下:
[java] view
plaincopy
public void loadHtml()
{
WebView webview = new WebView(this);
WebSettings wSet = webview.getSettings();
wSet.setJavaScriptEnabled(true);
webview.loadUrl("file:///android_asset/a.html");
setContentView(webview);
}
4. 将手机装上工程A和工程B。打开工程A,可以发现:工程B的JumpActivity会自动被打开。如下图所示:在Intent中可以去到网页里发出的链接:sharetest://data/123。
因此,我们就可以在JumpActivity里处理接收到的消息了。
通过以上的4步,相信大家都了解如何让应用接收和处理某种Uri消息。因此,只要我们
1. 在ManiFest里为Activity申明接收并处理某种Uri
2. 在页面中添加以下代码:其中,l为符合Activity处理规则的Uri地址。
[java] view
plaincopy
<iframe src="l" style="display:none"></iframe>
就可以让已安装该应用的用户在打开该网页的时候,自动的跳转到应用内部。
点击微信和QQ分享跳转到程序内部的原理与此一致。
首先在Mainifest文件里面对要启动的Activity添加一个过滤器。
[java] view
plaincopy
<activity
android:name="com.example.helloworld.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="znn"/>
</intent-filter>
</activity>
在MainActivity接收数据:
[java] view
plaincopy
public class MainActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = getIntent();
String scheme = intent.getScheme();
Uri uri = intent.getData();
System.out.println("scheme:"+scheme);
if (uri != null) {
String host = uri.getHost();
String dataString = intent.getDataString();
String id = uri.getQueryParameter("d");
String path = uri.getPath();
String path1 = uri.getEncodedPath();
String queryString = uri.getQuery();
System.out.println("host:"+host);
System.out.println("dataString:"+dataString);
System.out.println("id:"+id);
System.out.println("path:"+path);
System.out.println("path1:"+path1);
System.out.println("queryString:"+queryString);
}
}
}
写一个最简单的网页:
[html] view
plaincopy
<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,用来接收外部的跳转。代码如下:
[java] view
plaincopy
public class JumpActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getDataString();
System.out.println(data);
}
}
在这个Activity里,我们可以通过getIntent(),来获取外部跳转传过来的信息。
2. 修改ManiFest文件,设置Activity的接收Action的属性,代码如下:
[java] view
plaincopy
<activity android:name=".JumpActivity" >
<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:host="data"
android:scheme="sharetest" />
</intent-filter>
</activity>
如上所示,在data里设置了 scheme和host,则该Activity可以接收和处理类似于 "sharetest://data/XXX"的链接。
3. 接下来我们可以写一个测试工程B,看看工程A中的JumpActivity是否可以接收和处理类似于 "sharetest://data/XXX"的链接。因此,新建一个工程B,工程里只有一个WebView,用来打开一个本地的网页。由于WebView在接收到自己不能处理的Uri时,会自动的调用发送Intent来调用能够处理该Uri的应用。
以下是网页的代码:
[html] view
plaincopy
<!DOCTYPE html>
<html>
<body>
<iframe src="sharetest://data/123" style="display:none"></iframe>
</body>
</html>
将该网页放到Assets目录下,在代码里调用Webview加载该Html文件,代码如下:
[java] view
plaincopy
public void loadHtml()
{
WebView webview = new WebView(this);
WebSettings wSet = webview.getSettings();
wSet.setJavaScriptEnabled(true);
webview.loadUrl("file:///android_asset/a.html");
setContentView(webview);
}
4. 将手机装上工程A和工程B。打开工程A,可以发现:工程B的JumpActivity会自动被打开。如下图所示:在Intent中可以去到网页里发出的链接:sharetest://data/123。
因此,我们就可以在JumpActivity里处理接收到的消息了。
通过以上的4步,相信大家都了解如何让应用接收和处理某种Uri消息。因此,只要我们
1. 在ManiFest里为Activity申明接收并处理某种Uri
2. 在页面中添加以下代码:其中,l为符合Activity处理规则的Uri地址。
[java] view
plaincopy
<iframe src="l" style="display:none"></iframe>
就可以让已安装该应用的用户在打开该网页的时候,自动的跳转到应用内部。
点击微信和QQ分享跳转到程序内部的原理与此一致。
相关文章推荐
- Remove Google Play Games libraries on iOS (Unity3D开发之二十一)
- Remove Google Play Games libraries on iOS (Unity3D开发之二十一)
- Android Studio 简介及导入 jar 包和第三方开源库方[转]
- 微信开发入门教程-- 公众平台服务器url配置
- 如何在mac本上安装android sdk(sdk下载失败)
- Android EventBus源码解析
- ios 播放声音文件
- ios 本地存储之NSUserDefaults
- Android:AsyncTask -- 异步任务
- ios- 音乐播放器(1)
- android 限制广播消息的接收者
- GTS Fail修改集锦com.google.android.xts.afw.AfwRequiredAppsOverlaysTest
- Android的BUG(三) - 广为人知的诟病:频繁重启问题
- MappingException: Unknown entity解决方案
- android数据库——GreenDao
- 给学习iOS开发同学的建议
- Android 四大组件之一:Service后台服务之IntentService
- 大势所趋!十大令人振奋的移动端APP设计趋势
- OC与runtime
- 零基础学iOS开发