定义
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); }
作者:Kandy_JS
链接:https://www.jianshu.com/p/53cfb2d87d92
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦