在Android中通过文件的MIME类型来判断有哪些应用程序可以处理这些文件,并使用其中的某一个应用程序(如果有多个可选的应用程序,则用户必须指定一个)处理之。
我在写android资源管理器(文件浏览器)的时候,希望能在资源管理器的中实现打开文件的 *** 作,此时就需要用到文件的MIME类型。
(来自网络资源)
.setType("*/*")用于查找文件的mime类型
application/vnd.ms-excel xls
audio/mpeg mp3
image/gif gif
image/jpeg jpg
application/msword doc
application/pdf pdf
1 隐式启动自己的活动
无论隐式让毕消启动自己的程序还是启动外部的程序,从原理上来说都是一致的
1.1 配置过滤器
1.1.1
每个activity都可以在清单文件中配置intent-filter,意图过滤器
1.1.2
在intent-filter中配置action,catagory,data,这三个参数用于过滤,即通过和这三个参数之间的匹配,确定要启动那数和个activity。
1.1.3
可以配置多个action,多个catagory,多个data。
如果显式启动程序,则不需要这三个参数,如果隐式启动程序,则至少需要一个action,一个catagory,data可以没有
1.1.4
action,和catagory中需要设置name,data主要可以设置scheme和mimetype,可以单独设置scheme或者单独设置mimetype,也可以既设置scheme,也设置mimetype。name,scheme,mimetype的值可以自己指定。
1.1.5
如果活动是主活动,即打开app自动启动的活动,则需要按下面的配置,格式是固定的,不能更改
如果活动不是主活动,而且需要隐式启动,则至少有一个action,名字随便,一个catagory 名字是android.intent.category.DEFAULT。其他的各种参数没有强制规定。
具体的格式如下
1.2 启动活动
1.2.1 活动的响应
启动活动需要使用intent对象,intent中设置action,catagory,data,action和catagory就是intent中定义的相应的名字,data需要设置mimetype和scheme。
如果没有设置data
则只要intent中设置的action和catagory在intent-filter中配置的action和catagory中都有,相应的活动就可以响应。例如1.1.5中配置的intent-filter,假设它没有配置data,现在有一个intent,设置了action为com.example.zyl,catagory为android.intent.category.DEFAULT那么这个活动就会被响应
如果设置了data
action和catagory匹配规则不变,intent中设置的对应data的参数(mimeType,scheme等)必须要匹配其中的任何一个data,也就是intent中设置的对应data参数必须和intent-filter中设置的data完全一致,才能被响应。还是上面中的那个例子,现在有一个intent,设置了action为com.example.zyl,catagory为android.intent.category.DEFAULT,还需要设置data的mimetype为zzz,scheme为zyl,这个活动才能被响应
1.2.2 设置action
首先定义一个Intent对象,Intent是活动,广播,服务之前相互启动和通信的桥梁,并坦知设置action,action就是zai有两种方式
第一种,直接在intent的参数中传入action
第二种,用setAction方法设置action
1.2.3 设置catagory
当要启动活动的时候,调用startActivity时,系统会自动为intent添加一个catagory属性,这个catagory属性的名字是android.intent.category.DEFAULT。也就是说所有隐式启动的活动都会有这个catagory这个属性,这也就是为什么活动的intent-filter中必须配置android.intent.category.DEFAULT这个属性。
所以,既然所有的intent-filter中都有android.intent.category.DEFAULT这个属性,而启动活动时系统又会为intent添加这个属性,那么catagory这个属性就不用自己配置也会匹配的。
如果想要进一步过滤的话,也可以为intent继续设置catagory这个属性。设置的方法是
传入需要过滤的catagory的名字
1.2.4 设置data
如果intent-filter中没有设置data,那么上面两步就可以隐式的启动一个活动了,但是如果intent-filter中设置了data属性,那么如果想要启动那个活动,就必须为intent设置data。
这里只说两个比较重要的data的属性,scheme和mimetype
scheme
scheme通过setData设置
产生一个Uri对象,如下。调用Uri.parse方法产生Uri对象,这个对象中传入一个字符串,中间用:分开,前面对应的就是scheme参数,这个scheme需要和intent-filter中配置的scheme一致,后面就是需要通过setData方法传入的参数。
然后
将Uri对象传入
mimeType
设置mimeType,如果intent-filter中设置了mimetype属性,则通过setType方法,为intent设置mimeType,这个mimeType需要和intent-filter中设置的mimeType一致,自己定义的mineType的格式必须满足 / 这种形式,*代表任何字符。
------------------------------一个重要的问题-------------------------------------
如果在intent-filter中只设置scheme或者只设置了mimeType,则用上面的方法就可以了。
但是如果intent-filter中同时设置scheme和mimeType,那么就会产生一个问题,因为调用setData时会屏蔽setType,而setType时,会屏蔽setData。所以这时需要用一个方法,同时设置data和mimeType。这个方法叫setDataAndType,如下
-----------------------------另一个说明--------------------------------------------
setData有两个作用,一个作用是匹配scheme,另一个作用是传递数据。
调用setData时,可以指定scheme也可以不指定scheme,如果intent-filter中配置了scheme,可以在setData指定scheme,启动这个活动同时传递数据,如果intent-filter中没有指定scheme,在setData时,可以不指定scheme,只传递数据,例如下面这种写法,,也是可以的。对于setData传递数据这一块,在下面数据的传递那一块进行说明。
2 隐式启动其他的应用程序
通过和意图过滤器相互匹配就可以打开相应的活动,所以只要知道其他应用的意图过滤器是怎么配置的,自然就可以通过隐式启动的方法启动其他app中的活动
2.1 打电话
2.1.1 设置action
跳转到拨号界面,不直接拨打,对应的action为Intent.ACTION_DIAL,这个是系统封装好的字符串,对应拨号界面的action
直接拨打电话,对应的action为Intent.ACTION_CALL
或者
2.2.2 设置scheme
还需要设置scheme为tel
2.2.3 开启权限
要实现打电话功能,还需要在manifest中注册权限
2.2.4 开启活动
以上四步就实现了打电话的功能
2.2 发短信
2.2.1 设置action
2.2.2 传递要发送的联系人和设置scheme
2.2.3 传递要发送的短信内容
2.2.4 开启活动
以上四布就可以进入发送短信的界面,但是要手动发送短信,如果想直接发送短信,需要借助发送短信的manager类方法,详情在manager那部分写着
3 打开各种文件
对于手机中的各种文件,如果想调用相应的程序打开这些软件,就可以使用Intent.ACTION_VIEW,通过设置data传入数据内容,通过设置type筛选打开文件的程序的类型。这时就需要采用setDataAndType
例子如下
上面的例子就会调取可以打开这个文件的程序,供用户选择。
主要的就是设置数据和type,数据就直接从文件中读取就可以了,最重要的就是通过type来过滤应用程序。下面列出一个主要的mimeType类型
如果显式启动程序,那么不需要配置任何的intent-filter
直接在intent中传入当前活动的对象,和要打开的活动的.class对象,然后开启活动即可
1 传递数据的方法
传递数据也通过intent,intent携带着数据,从一个活动,到另一个活动,传递数据有两种方法,一种是setData方法,一种是putExtra方法。无论是显式启动还是隐式启动,都可以调用这两种方法。
1.1 setData方法
1.1.1
在第一个活动中intent调用setData的方法,携带数据,传入一个Uri类型的数据,根据另一个活动中的相应配置,可以携带scheme参数,也可以不携带scheme参数
1.1.2
在另一个活动中接收数据
首先获取到传入的intent对象,然后通过getData()(返回一个Uri类型的数据),或者getDataString()(返回一直String类型的数据),如果传入的数据是一个String类型,则直接调用getDataString()就可以得到这个数据。
一般在自己的程序内部很少使用这种方式传递数据,当启动外部程序,外部程序又规定需要使用setData传递数据时,才会使用setData方式
1.2 putExtra方法
这种方法是传递数据最常用的方法
1.2.1 传递普通类型的数据
传入数据
获取数据
1.2.2 传递实体类对象的数据
想要传递实体类对象,首先创建实体类时要实现Serializable接口
现在准备实体类对象,和一个对象list
开始传递数据
第一种方式
传入数据时使用putExtra方式,即可以传入单个对象,也可以传入对象的list
获取数据
第二种方式
通过Bundle传递数据,同样既可以传入单个实体类对象,也可以传入实体类list
传入数据
接收数据
2 接收从下一个活动返回的数据
上面传递数据都是直接传递给下一个活动,现在想从下一个活动返回数据,启动活动是的方法就从startActivity变成了startActivityForResult
2.1 向下一个活动传递数据
2.2 下一个活动返回数据
2.3 第一个活动接收数据
想接收返回的数据,需要重写第一个活动的onActivityResult
Intent.ACTION_GET_CONTENT这个是调用系统程序用的,比纳态蔽如一个打开一个文件的时候会提示你用哪个软件打开,setType()就是设置默认用哪种格式闭谈打开,比如"洞州video/*","audio/amr"欢迎分享,转载请注明来源:内存溢出
评论列表(0条)