Intent-filter的配置和Intent的发送

假设我们写了一个文本阅读器,我们肯定希望当用户通过手机上的文件浏览器点击一个文本文件开时,会主动的使用我们的文本阅读器来打开,就像Windows里双击一个文本文件,默认的总是用记事本打开一样。但是用户设备上的文件浏览器并不知道是否有我们这样一个文本阅读器的应用存在,而且不同的文件浏览器,点击某一个文本文件时的处理根据开发者的心情不同,处理内容也是很随意的,这里我们只针对Android SDK文档中推荐的方式来处理。
一般情况下,在文件浏览器中,点击某一个文本文件时,会由如下代码来尝试启动一个Activity来显示这个文本文件中的内容。
代码一(文件浏览器中的代码):
  1. Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
  2. Uri data = Uri.fromFile(file);
  3. intent.addCategory(android.content.Intent.CATEGORY_DEFAULT);
  4. intent.setData(data);
  5. //  intent.setDataAndType(data, "text/plain");
  6. //  intent.setDataAndType(data, "*/*");
  7. intent.putExtra("url", aDirectory.getAbsolutePath());
  8. try {
  9.     startActivity(intent);
  10. } catch (ActivityNotFoundException e) {
  11.     Toast.makeText(this, "ActivityNotFound", Toast.LENGTH_SHORT).show();
  12. };
复制代码
针对上面的这种情况,我们一般通过在AndroidManifest.xml中配置下面这样的intent-filter来接收文件浏览器发出来的Intent。
代码二(文本阅读器的配置文件):
  1. <intent-filter>
  2.     <action android:name="android.intent.action.VIEW" />
  3. <category android:name="android.intent.category.DEFAULT" />
  4.     <category android:name="android.intent.category.BROWSABLE" />
  5.     <data android:scheme="file" />
  6.     <data android:host="*" />
  7.     <data android:pathPattern=".*\\.txt"/>
  8. </intent-filter>
复制代码
下面,我们来详细的对上面的这两段代码做一个解释:
1)Intent中的Extra数据可有可无,不影响Intent接收。
也就是说,“代码一”中的如下代码是可有可无的。
        intent.putExtra("url", aDirectory.getAbsolutePath());
        Intent中Extra的附加数据是发给文本阅读器这个应用的,如果我不知道文本阅读器这个应用到底都需要些什么数据,这里可以不加,不会影响文本阅读器对这个Intent的接收。这里的意思是说,不附加Extra数据,文本阅读器相应的Activity一样会被启动,但是至于启动之后会做些什么,如果在Intent中没有取到自己想要的附加数据,它会怎么处理,那是文本阅读器应该考虑的事情,总之,这个Extra内的数据有或没有,不会影响到intent-filter的过滤。
2)默认的Category可以省略吗?
        首先,intent-filter中的<category>字段的配置是不能省略的,如果这个字段省略了,不管文件浏览器中的intent是否add了category,那么intent都不能被正常接收。
        其次,“代码一”中的如下语句可以省略。
        intent.addCategory(android.content.Intent.CATEGORY_DEFAULT);
        这个省略了,不会影响文本阅读器对intent的接收。
3)MIME Type是否需要设置?
        也就是说,在“代码一”中的如下代码使用哪一个更好呢?
        intent.setData(data);
        intent.setDataAndType(data, “text/plain”);
        我们从intent-filter的角度来考虑这个问题。
        a.如果intent-filter中,只配置了android:mimeType,而没有配置scheme,host,pathPattern这三个字段,如果我们使用了intent.setData(data);那么这个intent就会被intent-filter拒之门外了;
        b.如果intent-filter中只配置了scheme,host和pathType这三个字段,不论文件浏览器使用intent.setData(data);还是intent.setDataAndType(data,”text/plain”);这个intent都能通过intent-filter的过滤,被Activity正常接收。
        c.如果intent-filter中,既配置了mimeType,又配置了scheme,host和pathType这三个字段。那么在做过滤的时候,intent需要满足所有的这些条件才能被接收。也就是说文件浏览器通过intent.setData(data);这种方式的话,肯定是会被intent-filter拒之门外的。
如果我们在文件浏览器中,使用了intent.setData(data);那么在intent-filter就不能配置mimeType这一项,即使你只是使用了通配符<data android:mimeType="*/*" />

一般情况下,除了“file”开头的scheme之外,我们还会添加“content”开头的scheme
  1. <intent-filter>
  2.     <action android:name="android.intent.action.VIEW" />
  3.     <category android:name="android.intent.category.DEFAULT" />
  4.     <data android:scheme="content" />
  5.     <data android:host="*" />
  6.     <data android:pathPattern=".*\\.txt" />
  7. </intent-filter>
复制代码
在这里我们做一个简单的总结:
从文件浏览器的角度来讲,如果我们写了一个文件浏览器,想让它有更好的普适性,那么我们应该使用intent.setDataAndType(data,”text/plain”);
从文本阅读器的角度来讲,如果我们想让我们的阅读器有更好的普适性,我们应该尽量不要使用mimeType来配置intent-filter,除非不得已。更不要随意的使用<data android:mimeType="*/*" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值