我们都知道打开Activity的方式有2种,即显示意图和隐式意图.那么如何实现通过手机浏览器点击某个链点就能打开手机中已经安装的app呢?通过隐式意图就能实现这个功能.
先来看一段html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Document</title>
<style type="text/css">
a{
font-size: 40px;
}
</style>
</head>
<body>
<a href="app://launch/hello app">启动AppTerminalActivity</a>
</body>
</html>
代码很简单,就是一个a链接,目的是通过该a链接去启动目标app.其中app://对应的就是隐式意图的<data>标签的scheme属性.
再来看一段对应的目标Activity的隐式意图的定义:
<activity android:name=".AppTerminalActivity">
<intent-filter>
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.VIEW" />
<data android:scheme="app" />
</intent-filter>
</activity>
其中android.intent.category.BROWSABLE就是表示可以通过浏览器打开的类别.
最重要的就是<data android:scheme="app" />,这里定义了数据的协议,当然还可以定义很多的属性,这里我们定义scheme就够用了.一定要对应上面的a链点的协议,即app://,后面可以附带需要传递给目标app的一些数据.
然后我们在目标activity中接收a链点点击后传递过来的数据,显示在TextView上.代码如下:
/**
* Created by mChenys on 2015/11/1.
*/
public class AppTerminalActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText(getIntent().getData().toString());
setContentView(textView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
}
通过Intent的getData方法,该方法返回的是一个Uri对象,通过toString方法我们就可以查看到完整的数据了.
效果图:
通过手机浏览器打开目标网页
点击启动就可以启动目标Activity了.
可以看到getData拿到了a链点的整个href的属性值.
当然除了scheme属性,我们还可以设置host和pathPrefix属性,分别表示为主机名和路径前缀
<intent-filter>
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.VIEW" />
<data
android:host="blog.csdn.net"
android:pathPrefix="/mChenys"
android:scheme="app" />
</intent-filter>
效果如下: