android学习

Scheme跳转协议

2018-09-10  本文已影响0人  吃茶泡饭丶

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

关于URL,URI,Uri

所属:

import java.net.URL;

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

所属:

import java.net.URI;

URI仅仅是资源名称,知道了URI最多就是知道有这么一个名称的资源,也就是说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的内容,跳转相应的页面。

上一篇下一篇

猜你喜欢

热点阅读