Android之隐式意图启动Activity(二)

前言

这篇本来是要写Data的过滤规则,翻了好多资料,竟然总结不出一个令我觉得很不错的结果来,所以这篇就写一下自己的思考,如果有哪位朋友找到关于启动Activiyt中Data过滤好的总结,希望发个链接,让本人学习学习,在此非常的感谢。

data的匹配规则

它有以下几个属性能够设置

                <data android:scheme="string"
                      android:host="string"
                      android:port="80"
                      android:path="/string"
                      android:pathPattern="string"
                      android:pathPrefix="/string"
                      android:mimeType="string"/>

data由两部分组成,mimeType和URI。
mimeType指媒体类型,比如:image/jpeg、audio/mpeg4-generic和video/*
URI: < scheme>://< host>:< port>/[< path>|< pathprefix>|< pathPattern>]
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
Scheme:URI的模式,例如http、file、content等,如果没有指定该值,这个URI就是无效;
Host:URI的主机名;
Port: URI中的端口号;
Path:表示完整的路径信息
PathPattern:也表示完整的路径信息,不过它可以有*的通配符,要真正使用*时,要使用转义字符。
PathPrefix表示路径的前缀信息。
如果只设置了mimeType,那么URI中Scheme默认是content和file
Intent要指定完整的data,必须调用setDataAndType方法。
在使用隐式意图启动Activity之前,我们可以先判断一下,看系统中是否有Activity能够匹配我们的隐式意图,判断的方法有两种,resolveActivity与queryIntentActivities,resolveActivity方法Intent对象与PackageManager方法都有该方法,PackageManager的方法多一个参数,一般使用PackageManager.MATCH_DEFAULT_ONLY该标识即可,这个标识的含义是仅仅匹配哪些在intent-filter中声明了“android.intent.category.DEFAULT”这个category的Activity。只要resolveActivity方法返回不为空,则就匹配到该隐式意图可以启动一个Activity。queryIntentActivities方法返回的是一个集合,它返回的是所有能够匹配该隐式意图的Activity集合。

上面的引用是来自《Android开发艺术探索》一书

使用示例

这里使用的示例很简单,就是打开百度

        Intent intent = new Intent ();
        intent.setAction (Intent.ACTION_VIEW);
        intent.setData (Uri.parse ("https://www.baidu.com/"));
        List resolveInfos = getPackageManager ().queryIntentActivities (intent, PackageManager.MATCH_DEFAULT_ONLY);
        Log.i ("ysy","size:"+resolveInfos.size ());
        if(resolveInfos!=null && resolveInfos.size ()>0){
            startActivity(intent);
        }

Log打印的结果如下:
这里写图片描述
界面显示的是一个弹窗,有3个能够响应该隐式意图的应用,可供选择。
Android之隐式意图启动Activity(二)_第1张图片
这里mimeType没有进行设置,因为我自己不清楚要从这个网页拿到那种类型的东西,所以就没有设置。
自己的思考
可以看到在使用data过滤时,Intent对象是使用setData方法设置一个URI对象,从而达到过滤的目的,这里由于对URI的不了解,以及能够联想到URL,所以对这两个类进行了查询,大概的概念就是:URI是统一资源标识符;URL是统一资源定位符,然后呢URL是URI的子集,有一篇使用通俗易懂的话语描述了它俩的关系,这篇是URL与URI的区别;mimeType该属性的值有哪些可参考这里

总结

看到以上的内容,的确没有什么内容,还是希望对Data过滤启动activity这个知识点有独特见解的朋友多多指教。

你可能感兴趣的:(Android基础)