Scheme跳转协议

作者: 吃茶泡饭丶 | 来源:发表于2018-09-10 23:30 被阅读0次

Android中的Scheme是一种页面跳转协议,和网站通过URL的形式访问一样,APP同样可以通过这种方式进行跳转,它可以很方便的满足我们在一些场景中的需求:

  • 当应用接收到Push,点击通知栏消息跳转到特定页面,比如商品详情等。
  • 通过服务器下发的跳转路径,客户端可以根据路径跳转相应页面。
  • 应用跳转到其他APP指定页面。
  • H5页面点击锚点,APP端跳转具体页面。

关于URL,URI,Uri

  • URL:Uniform Resource Locator,通用资源定位符;

所属:

import java.net.URL;

URL是一种资源定位器和根据协议建立的约束规则与资源通信的读写机制,用于定位、读写资源。

  • URI:Uniform Resource Identifier,通用资源标识符;

所属:

import java.net.URI;

URI仅仅是资源名称,知道了URI最多就是知道有这么一个名称的资源,也就是说URI只能定位资源。

  • Uri:Universal Resource Identifier,通用资源标识符(同URI);

所属:

import android.net.Uri;

Uri是URI的“扩展”以适应Android系统的需要,Uri类是一个不可改变的URI引用,包括一个URI和一些碎片,Android上可用的每种资源 - 图像、视频片段等都可以用Uri来表示。

URI是一种更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分,换句话说,每个URL都是URI,但是不是每个URI都是URL的。同样属于URI子集的还有一个URN。

在Android中我们使用Uri

Uri

  • 结构
[scheme:]scheme-specific-part[#fragment]

进一步划分:

[scheme:][//authority][path][?query][#fragment]

上边的解释是抄来的
出处在此

Scheme怎么用

模拟点击链接获得链接中的参数

AndroidManifest中设置增加拦截器(intent-filter),设置scheme

<activity
       android:name=".SchemeActivity"
       android:launchMode="singleTask"
       android:screenOrientation="portrait"
       android:windowSoftInputMode="stateHidden|adjustResize">
       <intent-filter>
           <action android:name="android.intent.action.VIEW" />
           <category android:name="android.intent.category.DEFAULT" />
           <!--够被浏览器安全使用的 activitie 必须支持这个类别 此Demo中非必须-->
           <category android:name="android.intent.category.BROWSABLE" />
           <data android:scheme="chicha" />
       </intent-filter>
</activity>

设置链接

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_scheme)
        scheme_tvnodata.text = Html.fromHtml("<a href='chicha://domain/path?params'>CLICK THIS NODATA</a>")
        //激活链接
        scheme_tvnodata.movementMethod = LinkMovementMethod.getInstance()

        scheme_tvdata.text = Html.fromHtml("<a href='chicha://scheme_activity?type=0&buffer=这是个字符串'>CLICK THIS DATA</a>")
        scheme_tvdata.movementMethod = LinkMovementMethod.getInstance()

    }
}

在SchemeActivity中通过重写onNewIntent方法获取参数

 /**
  * 为了避免多次实例化这里我们使用onNewIntent
  */
  override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        val uri = intent?.data
        if (uri != null) {
            // 完整的url信息
            val url = uri.toString()
            Log.e(TAG, "url: $uri")

            // scheme部分
            val scheme = uri.scheme
            Log.e(TAG, "scheme: $scheme")

            // host部分
            val host = uri.host
            Log.e(TAG, "host: $host")

            //port部分
            val port = uri.port
            Log.e(TAG, "port: $port")

            // 访问路劲
            val path = uri.path
            Log.e(TAG, "path: $path")

            // Query部分
            val query = uri.query
            Log.e(TAG, "query: $query")

            //获取指定参数值
            val type = uri.getQueryParameter("type")
            Log.e(TAG, "type: $type")
            val buffer = uri.getQueryParameter("buffer")
            Log.e(TAG, "buffer: $buffer")
        }
    }

Log如下:

09-10 23:03:19.547 31722-31722/com.vayne.firstkotlintest E/BaseActivity: ------SchemeActivity
09-10 23:03:21.749 31722-31722/com.vayne.firstkotlintest E/SchemeActivity: 
url: chicha://scheme_activity?type=0&buffer=这是个字符串
scheme: chicha
host: scheme_activity
port: -1
path: 
09-10 23:03:21.750 31722-31722/com.vayne.firstkotlintest E/SchemeActivity: 
query: type=0&buffer=这是个字符串
type: 0
09-10 23:03:21.751 31722-31722/com.vayne.firstkotlintest E/SchemeActivity: 
buffer: 这是个字符串

服务器下发路径

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("chicha://domain/path?params")));

这里的”chicha://domain/path?params”就是服务器下发的跳转路径,当我们执行startActivity的时候就会调起SchemeActivity,然后我们通过在SchemeActivity解析scheme的内容,跳转相应的页面。

相关文章

  • Aroute之进阶使用

    通过Scheme跳转 Scheme是界面跳转协议,类似URL地址,通过url可以打开某个网站,而通过Scheme可...

  • Android URL Scheme唤醒之门

    1、scheme的作用 Android的scheme 是一种页面内跳转协议。通过scheme 可以进行页面跳转,可...

  • Android Scheme URL 使用方法

    URL Scheme 介绍 URL Scheme是一种页面内跳转协议,通过定义自己的URL Scheme协议,可以...

  • Android组件化开发之路(二)URL Scheme使用

    什么是 URL Scheme? android中的scheme是一种页面内跳转协议,通过定义自己的scheme协议...

  • Scheme协议

    Scheme是一种页面内跳转协议,通过自定义Scheme协议,可以跳转到app中的任何页面 服务器可以定制化跳转a...

  • Scheme跳转协议

    Android中的Scheme是一种页面跳转协议,和网站通过URL的形式访问一样,APP同样可以通过这种方式进行跳...

  • Android 利用scheme协议进行跳转

    什么是 URL Scheme? android中的scheme是一种页面内跳转协议。 通过定义自己的scheme协...

  • Android 系统路由Scheme跳转

    scheme在Android中是一种页面跳转的协议。通过定义自己的scheme可以非常方便的实现页面跳转,适合组件...

  • iOSAPP之间的相互跳转

    定义跳转URL协议 NSString *url = @"scheme://host:port/url.path?u...

  • Aroute之Scheme

    是什么 Scheme是界面跳转协议,类似URL地址,通过url可以打开某个网站,而通过Scheme可以打开app的...

网友评论

    本文标题:Scheme跳转协议

    本文链接:https://www.haomeiwen.com/subject/nnjdgftx.html