zoukankan      html  css  js  c++  java
  • IntentFilter

     当Intent在组件间传递时,组件假设想告知Android系统自己可以响应和处理哪些Intent,那么就须要用到IntentFilter对象。

        顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,仅仅将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即仅仅列出组件乐意接受的Intent,但IntentFilter仅仅会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件能够有一个或多个IntentFilter,每一个IntentFilter之间相互独立,仅仅须要当中一个验证通过则可。除了用于过滤广播的IntentFilter能够在代码中创建外其它的IntentFilter必须在AndroidManifest.xml文件里进行声明。

        IntentFilter中具有和Intent相应的用于过滤ActionDataCategory的字段,一个隐式Intent要想被一个组件处理,必须通过这三个环节的检查。

           

           一:检查 Action 虽然一个Intent仅仅能够设置一个Action,但一个Intentfilter能够持有一个或多个Action用于过滤,到达的Intent仅仅须要匹配当中一个Action就可以。 深入思考:假设一个Intentfilter没有设置Action的值,那么,不论什么一个Intent都不会被通过;反之,假设一个Intent对象没有设置Action值,那么它能通过全部的Intentfilter的Action检查。

            

           二:检查 Data 同Action一样,Intentfilter中的Data部分也能够是一个或者多个,并且能够没有。每一个Data包括的内容为URL和数据类型,进行Data检查时主要也是对这两点进行比較,比較规则: 假设一个Intent对象没有设置Data,仅仅有Intentfilter也没有设置Data时才可通过检查。 假设一个Intent对象包括URI,但不包括数据类型:仅当Intentfilter也不指定数据类型,同一时候它们的URI匹配,才干通过检測。 假设一个Intent对象包括数据类型,但不包括URI:仅当Intentfilter也没指定URL,而仅仅包括数据类型且与Intent同样,才通过检測。 假设一个Intent对象既包括URI,也包括数据类型(或数据类型可以从URI判断出),仅仅有当其数据类型匹配Intentfilter中的数据类型,而且通过了URL检查时,该Intent对象才干通过检查。

       当中URL由四部分组成它有四个属性scheme、host、port、path相应于URI的每一个部分。

           比如:content://com.wjr.example1:121/files

           scheme部分:content

           host部分:com.wjr.example1

           port部分:121

           path部分:files

        host和port部分一起构成URI的凭据(authority),假设host没有指定,那port也会被忽略。

        这四个属性是可选的,但他们之间并非全然独立的。要让authority有意义,scheme必需要指定。要让path有意思,scheme和authority必须指定。 Intentfilter中的path能够使用通配符来匹配path字段,Intent和Intentfilter都能够用通配符来指定MIME类型。

        

         三:检查 Category Intentfilter中能够设置多个Category,Intent中也能够含有多个Category,仅仅有Intent中的全部Category都能匹配到Intentfilter中的Category,Intent才干通过检查。也就是说,假设Intent中的Category集合是Intentfilter中Category的集合的子集时,Intent才干通过检查。假设Intent中没有设置Category,则它能通过全部Intentfilter的Category检查。 假设一个Intent能够通过不止一个组件的Intentfilter,用户可能会被问那个组件被激活。假设没有目标找到,会产生一个异常。

    IntentFilter

    应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,能够声明一个甚至多个IntentFilter。每一个 IntentFilter描写叙述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比方之前请求网页浏览器这 个样例中,网页浏览器程序的IntentFilter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。

    怎样为组件声明自己的IntentFilter? 常见的方法是在AndroidManifest.xml文件里用属性<Intent-Filter>描写叙述组件的IntentFilter。

    前面我们提到,隐式Intent和IntentFilter进行比較时的三要素是Intent的Action、Data以及Category。实际 上,一个隐式Intent请求要可以传递给目标组件,必要通过这三个方面的检查。假设不论什么一方面不匹配,Android都不会将该隐式Intent传递给 目标组件。接下来我们解说这三方面检查的详细规则。

    1.动作測试

    <intent-filter>元素中能够包含子元素<action>,比方:

    1. <intent-filter> 
    2. <action android:name="com.example.project.SHOW_CURRENT" /> 
    3. <action android:name="com.example.project.SHOW_RECENT" /> 
    4. <action android:name="com.example.project.SHOW_PENDING" /> 
    5. </intent-filter> 

    一条<intent-filter>元素至少应该包括一个<action>,否则不论什么Intent请求都不能和该<intent-filter>匹配。

    假设Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通
    过了这条<intent-filter>的动作測试。

    假设Intent请求或<intent-filter>中没有说明详细的Action类型,那么会出现以下两种情况。

    (1) 假设<intent-filter>中没有包括不论什么Action类型,那么不管什么Intent请求都无法和这条<intent-filter>匹配。

    (2) 反之,假设Intent请求中没有设定Action类型,那么仅仅要<intent-filter>中包括有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为測试。

    2.类别測试

    <intent-filter>元素能够包括<category>子元素,比方:

    1. <intent-filter . . . > 
    2. <category android:name="android.Intent.Category.DEFAULT" /> 
    3. <category android:name="android.Intent.Category.BROWSABLE" /> 
    4. </intent-filter> 

    仅仅有当Intent请求中全部的Category与组件中某一个IntentFilter 的<category>全然匹配时,才会让该Intent请求通过測试,IntentFilter中多余的<category> 声明并不会导致匹配失败。一个没有指定不论什么类别測试的IntentFilter仅仅仅仅会匹配没有设置类别的Intent请求。

    3.数据測试

    数据在<intent-filter>中的描写叙述例如以下:

    1. <intent-filter . . . > 
    2. <data android:type="video/mpeg" android:scheme="http" . . . /> 
    3. <data android:type="audio/mpeg" android:scheme="http" . . . /> 
    4. </intent-filter> 

    <data>元素指定了希望接受的Intent请求的数据URI和数据类 型,URI被分成三部分来进行匹配:scheme、authority和path。当中,用setData()设定的Intent请求的URI数据类型和 scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也须要相匹配才会 通过測试。

    解说完Intent基本概念之后,接下来我们就使用Intent激活Android自带的电话拨号程序。通过这个实例你会发现,使用Intent并不像其概念描写叙述得那样难。

     

    IntentFilter
    简述:结构化描写叙述intent匹配的信息。包括:action,categories and data(via type,scheme ,path),还有priority, to order multiple matching filters.
           IntentFilter 中假设action为空,则视为通配符,假设type为空,则intent必须不设type,否则匹配不上。
           data被分为3个属性:type,scheme,authority/path 不论什么设置的属性intent必须匹配上。
                               设置了scheme 而没设type,则intent也必须类似,不能设置type,也不能是content: URI.
                               设置了type而没设scheme:将匹配上没有URI的intent,或者content:,file:的uri。
                               设置了authority:必须指定一个或多个相关联的schemes
                               设置了path:唏嘘指定一个或多个相关联的schemes
           匹配规则:
               IntentFilter 匹配Intent的上的条件:
               Action : 值同样 ,或则IntentFilter未指定action.
               DataType:. 系统通过调用Intent.resolve(ContentResolver)获取type,通配符*
                         在Intent/IntentFilter的MIME type中使用,区分大写和小写
               DataScheme:系统通过调用Intent. getData() and Uri.getScheme())获取scheme, 区分大写和小写
               DataAuthority:必须有一个dataScheme匹配上且authority值匹配上,或者IntentFilter未定义。Intent. getData() and Uri.getAuthority()获取authority.
               DataPath: scheme and authority必须先匹配上 ntent. getData() and Uri.getPath(),获取. 或者IntentFilter未定义
               Categories:all of the categories in the Intent match categories given in the filter 多余的Categorie,不影响intent匹配,假设IntentFilter
                      没有指定Categorie,则仅仅能匹配上没有Categorie的intent。

    经常使用intent列表:
    Android Intent 使用方法汇总
    显示网页
    - <activity android:name="BrowserActivity" android:label="Browser" android:launchMode="singleTask" android:alwaysRetainTaskState="true" android:configChanges="orientation|keyboardHidden" android:theme="@style/BrowserTheme">
    - <!--
    For these schemes were not particular MIME type has been
                     supplied, we are a good candidate.
      -->
    - <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:scheme="about" />
      </intent-filter>
    - <!--
      For these schemes where any of these particular MIME types
                      have been supplied, we are a good candidate.
      -->
    - <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:mimeType="text/html" />
      <data android:mimeType="text/plain" />
      <data android:mimeType="application/xhtml+xml" />
      <data android:mimeType="application/vnd.wap.xhtml+xml" />
      </intent-filter>
    - <!--
    We are also the main entry point of the browser.
      -->
    - <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.LAUNCHER" />
      <category android:name="android.intent.category.BROWSABLE" />
      </intent-filter>
    - <intent-filter>
      <action android:name="android.intent.action.WEB_SEARCH" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      </intent-filter>
    - <intent-filter>
      <action android:name="android.intent.action.WEB_SEARCH" />
      <action android:name="android.intent.action.MEDIA_SEARCH" />
      <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    - <intent-filter>
      <action android:name="android.intent.action.SEARCH" />
      <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
      <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
    - <intent-filter>
      <action android:name="android.net.http.NETWORK_STATE" />
      <action android:name="android.intent.action.PROXY_CHANGE" />
      </intent-filter>
      </activity>

    1. Uri uri = Uri.parse("http://google.com");  
       2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
       3. startActivity(it); 

    显示地图

       1. Uri uri = Uri.parse("geo:38.899533,-77.036476");  
       2. Intent it = new Intent(Intent.ACTION_VIEW, uri);   
       3. startActivity(it);   
       4. //其它 geo URI 範例  
       5. //geo:latitude,longitude  
       6. //geo:latitude,longitude?z=zoom  
       7. //geo:0,0?q=my+street+address  
       8. //geo:0,0?q=business+near+city  
       9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom 



    路径规划

       1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");  
       2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
       3. startActivity(it);  
       4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456  


    打电话
       1. //叫出拨号程序 
       2. Uri uri = Uri.parse("tel:0800000123");  
       3. Intent it = new Intent(Intent.ACTION_DIAL, uri);  
       4. startActivity(it);  

       1. //直接打电话出去  
       2. Uri uri = Uri.parse("tel:0800000123");  
       3. Intent it = new Intent(Intent.ACTION_CALL, uri);  
       4. startActivity(it);  
       5. //用這個,要在 AndroidManifest.xml 中,加上  
       6. //<uses-permission id="android.permission.CALL_PHONE" />  

    传送SMS/MMS
       1. //调用短信程序 
       2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
       3. it.putExtra("sms_body", "The SMS text");   
       4. it.setType("vnd.android-dir/mms-sms");  
       5. startActivity(it); 

       1. //传送消息 
       2. Uri uri = Uri.parse("smsto://0800000123");  
       3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);  
       4. it.putExtra("sms_body", "The SMS text");  
       5. startActivity(it); 

       1. //传送 MMS  
       2. Uri uri = Uri.parse("content://media/external/images/media/23");  
       3. Intent it = new Intent(Intent.ACTION_SEND);   
       4. it.putExtra("sms_body", "some text");   
       5. it.putExtra(Intent.EXTRA_STREAM, uri);  
       6. it.setType("image/png");   
       7. startActivity(it);  

    传送 Email
       1. Uri uri = Uri.parse("mailto:xxx@abc.com");  
       2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);  
       3. startActivity(it);  

       1. Intent it = new Intent(Intent.ACTION_SEND);  
       2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");  
       3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");  
       4. it.setType("text/plain");  
       5. startActivity(Intent.createChooser(it, "Choose Email Client"));  

       1. Intent it=new Intent(Intent.ACTION_SEND);    
       2. String[] tos={"me@abc.com"};    
       3. String[] ccs={"you@abc.com"};    
       4. it.putExtra(Intent.EXTRA_EMAIL, tos);    
       5. it.putExtra(Intent.EXTRA_CC, ccs);    
       6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");    
       7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");    
       8. it.setType("message/rfc822");    
       9. startActivity(Intent.createChooser(it, "Choose Email Client")); 

       1. //传送附件
       2. Intent it = new Intent(Intent.ACTION_SEND);  
       3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");  
       4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");  
       5. sendIntent.setType("audio/mp3");  
       6. startActivity(Intent.createChooser(it, "Choose Email Client")); 

    播放多媒体
           Uri uri = Uri.parse("file:///sdcard/song.mp3");  
           Intent it = new Intent(Intent.ACTION_VIEW, uri);  
           it.setType("audio/mp3");  
           startActivity(it); 



           Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");  
           Intent it = new Intent(Intent.ACTION_VIEW, uri);  

           startActivity(it); 



    Market 相关
    1.        //寻找某个应用 
    2.        Uri uri = Uri.parse("market://search?q=pname:pkg_name"); 
    3.        Intent it = new Intent(Intent.ACTION_VIEW, uri);  
    4.        startActivity(it);  
    5.        //where pkg_name is the full package path for an application 

    1.        //显示某个应用的相关信息 
    2.        Uri uri = Uri.parse("market://details?id=app_id");  
    3.        Intent it = new Intent(Intent.ACTION_VIEW, uri); 
    4.        startActivity(it);  
    5.        //where app_id is the application ID, find the ID   
    6.        //by clicking on your application on Market home   
    7.        //page, and notice the ID from the address bar 


    Uninstall 应用程序
    1.        Uri uri = Uri.fromParts("package", strPackageName, null); 
    2.        Intent it = new Intent(Intent.ACTION_DELETE, uri);   
    3.        startActivity(it);  

  • 相关阅读:
    PAT 甲级 1027 Colors in Mars
    PAT 甲级 1026 Table Tennis(模拟)
    PAT 甲级 1025 PAT Ranking
    PAT 甲级 1024 Palindromic Number
    PAT 甲级 1023 Have Fun with Numbers
    PAT 甲级 1021 Deepest Root (并查集,树的遍历)
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯 算法提高 抽卡游戏
    Java实现 蓝桥杯 算法提高 抽卡游戏
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4269581.html
Copyright © 2011-2022 走看看