引用
1、Android业务组件化之URL Scheme使用
2、android 通过schema唤起应用指定页面
3、js 通过schema协议拉起本地app
定义
1、android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。
2、schema也是【隐示启动】中的一种,在data属性下的,其他内容查看Android Intent的隐示启动(启动其他APP界面并传递数据)
使用场景
- 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
- H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面,如果没有的话跳转下载等
- APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
- APP根据URL跳转到另外一个APP指定页面
- 各种二维码扫码跳转
规则
-
schema完整路径:schema://host:port/path/query
- authority --> host:port
- query --> queryParameter=queryString
-
举例:xl://goods:8888/goodsDetail?goodsId=10011002
- schema=xl
- host=goods
- port=8888 (必须是int型哦)
- authority=goods:8888
- path=/goodsDetail
- query=(此处方便看清,稍微隔开一点)goodsId=10011002
截图
schema.png实例
-
需要被打开的activity在manifest清单文件中的写法,注意action和category就行了
<!--schema-->
<activity android:name=".module.study.components.activity.schema.ZZZActivity"
android:screenOrientation="portrait">
<intent-filter>
<!--action.VIEW和category.DEFAULT必须设置-->
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<!--如果需要浏览器支持打开,则category.BROWSABLE-->
<category android:name="android.intent.category.BROWSABLE"/>
<!--schema的协议类型:随便设置,只要按照统一规则,前后端一致就行-->
<data
android:scheme="xl"
android:host="goods"
android:port="8888"
android:path="/goodsDetail"
/>
</intent-filter>
</activity>
-
被打开的activity中部分内容,主要是为了看schema或者说uri的结构的
if(getIntent() != null){
Uri uri = getIntent().getData();
//完整路径
String url = uri.toString();
//authority
String authority = uri.getAuthority(); //host:port
//schema
String schema = uri.getScheme();
//host
String host = uri.getHost();
//port
int port = uri.getPort();
//path
String path = uri.getPath();
//query
String query = uri.getQuery(); //queryParameter=queryString
//param
String param = uri.getQueryParameter("goodsId");
//最后组装
String finalPath = schema+"://"+host+":"+port+"/"+path+"?"+query;
tv_xxx.setText("由Schema打开的活动画面\n"+
"url="+url+"\n"+
"finalPath="+finalPath+"\n");
}
-
如何使用schema去隐示启动这些activity
方法一:只有:action.VIEW和category.DEFAULT设置的时候
/**
* 只有:action.VIEW和category.DEFAULT设置的时候
* */
private void openSchema1(){
Intent it = new Intent();
it.setAction(Intent.ACTION_VIEW);
it.setData(Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
startActivity(it);
}
方法二:既有:action.VIEW和category.DEFAULT设置的时候,又有:category.BROWSABLE
/**
* 既有:action.VIEW和category.DEFAULT设置的时候
* 又有:category.BROWSABLE
* */
private void openSchema2(){
webView.loadUrl("xl://goods:8888/goodsDetail?goodsId=10011002");
}
补充:询问有没有activity
/**
* 检测某个应用是否安装
*
* @param context
* @param packageName
* @return
*/
public static boolean isAppInstalled(Context context, String packageName) {
try {
context.getPackageManager().getPackageInfo(packageName, 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/**
* 检测某个应用是否安装
*
* @param context
* @param intent
* @return
*/
public static boolean isAppInstalled(Context context, Intent intent){
List acts = context.getPackageManager().
queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return (acts.size() > 0);
}
/**
* 检测某个应用是否安装
*
* @param context
* @param intent
* @return
*/
public static boolean isAppInstalled2(Context context, Intent intent){
return (intent.resolveActivity(context.getPackageManager()) != null);
}
真的要过年啦~~~~~
网友评论