北京白癜风治疗的好医院 https://yyk.39.net/hospital/89ac7_knowledges.html
Android正确使用Scheme协议打开App,兼容浏览器scheme的二次跳转
URLScheme
URLScheme是一种页面内跳转协议,通过定义自己的URLScheme协议,可以实现
从一个APP中打开另外一个APP指定的页面
从H5页面中跳转到APP指定的页面(实际上就是从一个浏览器中的一个页面跳转到APP指定页面)。
URLScheme协议格式:
一个完整的完整的URLScheme协议格式由scheme、host、port、path和query组成,其结构如下所示:
scheme://host:port/path?query
如下就是一个自定义的URL
openapp://hhong:80/product?productId=
openapp:即Scheme该Scheme协议名称(必填)
hhong:即Host,代表Scheme作用于哪个地址域(必填)
80:即port,代表端口号
product:即path,代表打开的页面
param:即query,代表传递的参数
传递参数的方法跟web端一样,通过问号?分隔,参数名和值之间使用等号=连接,多个参数之间使用拼接。
Scheme使用
既然我们使用scheme来做打开app并跳转的逻辑,那这个scheme应该声明在哪里比较合适呢?如果你的应用在启动页(splash)或者在主界面(main)初始化了一些必要的设置,比如必要的token信息检查交易或者一些其它校验等,没有这些信息会造成崩溃的,这个时候我们就需要在启动页来声明这个scheme了,获取scheme信息保存起来,然后在主界面做处理逻辑,如跳转到其它界面等。当然你也可以声明scheme在其它地方,具体得需要看怎么实现业务比较方便。
如配置SplashActivity完整的打开链接为openapp://hhong:80/product?param=,需要在AndroidManifest.xml配置(SplashActivity启动模式为默认standard模式)
activityandroid:name=".SplashActivity"intent-filteractionandroid:name="android.intent.action.MAIN"/categoryandroid:name="android.intent.category.LAUNCHER"//intent-filterintent-filter!--必须设置--actionandroid:name="android.intent.action.VIEW"/categoryandroid:name="android.intent.category.DEFAULT"/!--需要被网页拉起必须设置--categoryandroid:name="android.intent.category.BROWSABLE"/!--协议部分--dataandroid:host="hhong"android:path="/product"android:port="80"android:scheme="openapp"//intent-filter/activity
定义好scheme相关的参数后,现在我们需要用scheme调起目标app,主要有两种方式
APP中打开另一个APP指定的页面
Stringurl="openapp://hhong:80/product?productId=";Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(url));//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);StringintentUri=intent.toUri(Intent.URI_INTENT_SCHEME);Log.e(TAG,"action是:"+intentUri);startActivity(intent);
这种方式的跳转比较简单,也是最不容易出错的。
浏览器中的一个页面跳转到APP指定页面
这种方式的跳转可能同样的代码会导致不同的结果,因为涉及到浏览器,而不同的手机厂商不能保证所有的浏览器内核是一样的,进而可能对scheme的处理也是不一样。
前提:项目用的框架是蚂蚁的MPASS,这个项目可能和正常工程项目不同,因为框架对项目的启动方式做了封装,有兴趣的同学也可以去看下这个框架。
问题:app未启动时,由