IntentFilter的匹配规则

<关于隐式调用Activity>
隐式调用Acitvity需要去匹配目标组件的IntentFilter中所有的过滤信息,如果不匹配则无法启动目标Activity。
IntentFilter中有action,category,data三个过滤信息。在Menifest中,一个intent-filter可以声明多个action、category、data。只有一个intent同时匹配action、category、data才能算完全匹配去启动Activity。 另外一个Activity可以有多组IntentFilter,只要intent能够完全匹配一组就行。

  • action的匹配规则
    是一个字符串,有系统定义的action,也可以是我们自己定义的action。匹配时要求Intent里必须要有一个action并且此action和过滤规则中的任意一个action相同。并且需要区分大小写。
  • category的匹配规则
    是一个字符串,有系统定义的category,也可以是我们自己定义的category。匹配要求Intent中可以没有category,但如果有一个或者多个,那么每个都要和intentfilter中的category匹配,匹配完全相同才能启动Activity。当Intent没有category的时候也可以调用,因为startActivity和startActivityForResult默认为Intent加上“android.intent.category.DEFAULT”。所以我们也要在intentfilter中加上这个“android.intent.category.DEFAULT”。
  • data的匹配规则
    有两个部分组成,mimeType和URI。mimeType是指媒体类型,比如image/jepg等的图片,音频,视频等,媒体格式。而URI中包含的数据就比较多了,下面是其格式
  • Andorid 开发艺术探索笔记(3)_多进程

  • Scheme:URI模式,比如http、file、content等,如果没有指定Scheme,那么整个URI无效。
    Host:URI的主机名,比如www.baidu.com,如果没有指定host,则整个URI无效。
    Port:URI的端口号,比如80,仅当scheme和host指定了才有效
    Path、PathPrefix、PathPattern:path表述路径信息,pathpattern也是,但它可以包含通配符“”,但是由于正则表达规范,所以要写成“\*”,“\”要写成“\”*,pathPrefix表示前缀信息。
    匹配规则要求intent中必须有data并且也要完全匹配intentfilter中的data。和action匹配规则类似。 intentfilter中可以没有URI,但它是有默认值的,为content或者file,所以当一个intentfilter中只声明了
<intent-filter>
<data android:mimeType="image/*" />
...

规则里指定了可以是所有类型的图片,但没有定义URI,这个时候intent可以写成

intent.setDataAndType(Uri.parse("file://abc"),"image/png");

上面的匹配方式可以适用于BroadcastReceiver和Service,但对于Service还是尽量用显示的调用方法去启动。我们可以采用一些方法来判断有哪些Activity可以匹配我们的intentfilter。一种是用PackageManager的resolveActivity或者Intent的resolveActivity方法,如果他们找不到返回值就会返回null,否则返回最佳匹配的Activity,还有queryIntentActivities方法返回所有的符合IntentFilter的actvity。

第二章 IPC机制

IPC指进程通信
线程是CPU调度的最小单元,是一种有限的系统资源。
进程指的是一个执行单元,是一个应用或者一个程序。
进程可以有多个线程。最简单情况下一个进程只有一个线程,这个线程是主线程,在Andoird中也叫做UI线程。
Andorid通过Binder、Socket等来实现进程通信。

<多进程模式>
这里的多进程一般指一个应用中的多个进程,不是多个应用中的进程通信。
在Android中使用多进程只有一个方法那就是在Menifest中指定process属性
比如有ABC三个Activity,包名为com.rikka,A为主Activity,不设置任何属性。
B的process为 “android:process=”:remote””
C的process为”android:process=”com.rikka.remote””
则启动之后将有三个进程出现,分别为 com.rikka , com.rikka:remote , com.rikka.remote。
这就是启动多进程的方法。其中B和C的process方法中的区别为:
“:”的含义是让在冒号之前加上包名,所以它的完整进程名为 com.rikka:remote,并且用这种指定方式的进程是当前应用的私有进程,不能让其它应用的进程和这个进程跑在一起。除开这种声明进程方式之外的进程都是全局进程。
而C的process是完整命名方式。作为全局进程,其它应用可以通过ShareUID来与其跑在一起。
Android会为每一个应用分配为一个UID,具有相同UID的进程才能共享数据。如果两个应用有相同的ShareUID,则他们可以互相访问对方的私有数据。如果跑在一个进程中甚至可以访问共享内存数据。