Android进阶之使用Scheme实现从网页启动APP

来源:互联网 发布:软件架构师书籍 编辑:程序博客网 时间:2024/06/05 14:12

0 转载地址

Android 使用Scheme实现从网页启动APP

1 导言

  通过使用Scheme,可以实现用手机的浏览器(内置或第三方)访问一个网页,启动自己的应用,或者在一个应用使用WebView.loadUrl()方法启动另外一个应用。
  

2 实现原理

  在Android平台而言,URI主要分三个部分:scheme, authority,path, queryString。其中authority又分为host和port。

// 格式如下scheme://host:port/path?qureyParameter=queryString
// 举个例子http://www.orangecpp.com:80/tucao?id=hello

  在Android的Manifest配置文件中,intent-filter配置项中有data配置,其中data包含内容有如下。通过配置data可以对网页进行过滤,符合匹配条件的网页才跳转到应用。一般只需要设置host和scheme即可。

<data android:host="" // 指定数据的主机名,如www.baidu.com      android:mimeType="" // 指定可以处理的数据类型,允许使用通配符的方式进行指定      android:path="" // 主机名和端口之后的部分      android:pathPattern=""      android:pathPrefix=""      android:port="" // 指定数据端口部分      android:scheme="" // 指定数据的协议部分,如http      android:ssp=""      android:sspPattern=""      android:sspPrefix=""/>

3 实现步骤

(1)首先我们写一个测试网页test.html

<!DOCTYPE html>  <html>  <body><h1>Test Scheme</h1> <!--自动加载隐藏页面跳转--><iframe src="myscheme://www.orangecpp.com:80/mypath?key=mykey" style="display:none"></iframe><!--手动点击跳转--><a href="myscheme://www.orangecpp.com:80/mypath?key=mykey">Click</a></body>  </html>

(2)创建一个Android测试工程,修改Manifest文件,给想要接收跳转的Activity添加intent-filter配置

<activity        android:name=".MainActivity"        android:label="@string/app_name"        android:theme="@style/AppTheme.NoActionBar">        <intent-filter>            <action android:name="android.intent.action.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />        </intent-filter>        <!--需要添加下面的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="myscheme"/> // 重点myscheme        </intent-filter>    </activity>

(3)在配置好intent-filter的Activity里即可获取外部跳转的参数信息

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent intent =getIntent();        Uri uri = intent.getData();        Log.e(TAG, "scheme: "+uri.getScheme());        Log.e(TAG, "host: "+uri.getHost());        Log.e(TAG, "port: "+uri.getPort());        Log.e(TAG, "path: "+uri.getPath());        Log.e(TAG, "queryString: "+uri.getQuery());        Log.e(TAG, "queryParameter: "+uri.getQueryParameter("key"));    }}
// 结果打印E/MainActivity: scheme:myschemeE/MainActivity: scheme: myschemeE/MainActivity: host: www.orangecpp.comE/MainActivity: port: 80E/MainActivity: path: /mypathE/MainActivity: queryString: key=mykeyE/MainActivity: queryParameter: mykey
原创粉丝点击