Android中Scheme协议的使⽤详解
⼀、⾸先什么是Scheme?
android中的scheme是⼀种页⾯内跳转协议,是⼀种⾮常好的实现机制,通过定义⾃⼰的scheme协议,可以⾮常⽅便跳转app中的各个页⾯;通过scheme协议,服务器可以定制化告诉App跳转那个页⾯,可以通过通知栏消息定制化跳转页⾯,可以通过H5页⾯跳转页⾯等。
客户端应⽤可以向系统注册⼀个 URL Scheme,该Scheme⽤于从浏览器或其他应⽤中启动本应⽤。通过指定的 URL 字段,可以让应⽤在被调起后直接打开某些特定页⾯。也可以执⾏某些指定动作。综上Scheme使⽤场景⼤致分以下⼏种:
1.服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页⾯
2.H5页⾯点击锚点,根据锚点具体跳转路径APP端跳转具体的页⾯
3.APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页⾯
4.APP根据URL跳转到另外⼀个APP指定页⾯
⼆、Scheme协议格式
上⾯说到Scheme是⼀种页⾯内跳转协议,那协议⼀定有固定的格式,在Android中Scheme属于Uri,下⾯就是Scheme的协议结构:
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
String url="angecpp:80/tucao?id=hello&name=lily";
//url = protocol + authority(host + port) + path + query
//协议protocol= http
//域名authority= angecpp:80
//主机host= angecpp
//端⼝port= 80
//页⾯path= /tucao
//参数query= id=hello&name=lily
在android中,除了scheme、authority是必须要有的,其它的⼏个path、query、fragment,它们每⼀个可以选择性的要或不要,但顺序不能变
三、Scheme的使⽤⽅式
Scheme的使⽤分为两个部分,在调⽤⽅传⼊Intent以及被调⽤⽅设置拦截并解析数据:
1.调⽤⽅使⽤Scheme的⽅式,基本有两种:
(1)
Uri uri = Uri.parse(schemeStr);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
(2)
<a href="xl://goods:8888/goodsDetail?goodsId=10011002">打开商品详情</a>
2.AndroidManifest中设置增加(intent-filter),增加设置scheme,在SchemeActivity中通过重写onNewIntent⽅法获取Scheme跳转参数
(1)AndroidManifest中设置增加(intent-filter),设置scheme
<activity
android:name=".SchemeActivity"
android:label="@string/app_name">
安卓intent用法<!-- 要想在别的App上能成功调起App,必须添加intent过滤器 -->
<!-- 协议部分,随便设置 -->
<intent-filter>
<!--协议部分,随便设置-->
<data android:scheme="scheme" android:host="mtime" android:path="/goodsDetail" />
<!--下⾯这⼏⾏也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
(2)在SchemeActivity中获取参数
public class SchemeActivity extends Activity {
private static final String TAG = "SchemeActivity";
private TextView schemeTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_scheme);
schemeTv = (TextView) findViewById(R.id.scheme_tv);
Uri data = getIntent().getData();
Log.i(TAG, "host = " + Host() + " path = " + Path() + " query = " + Query());
String param = QueryParameter("goodsId");
schemeTv.setText("获取的参数为:" + param);
}
}
四、在使⽤过程中会遇到的情况
(1)判断Scheme是否有效
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
startActivity(intent);
}
(2)如下两个Activity 当通过scheme 跳转界⾯时 ,系统会提⽰选择打开⽅式 因为没有精确匹配要跳哪个界⾯ <activity android:name=".ActivityAAAAAA">
<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="app"/*没有配置host 和path*/
/>
</intent-filter>
</activity>
<activity android:name=".ActivityBBBBBB">
<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="app"
android:host="com.bobo.package"
/>
</intent-filter>
</activity>
(3)如果不同的链接都要跳到⼀个Activity,Activity的配置
<activity android:name=".ActivityName">
<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="app"
android:host="com.bobo.package" android:path="/path"/>
<data android:scheme="application" android:host="host"
android:path="/route"/>
</intent-filter>
</activity>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论