Android 显示意图和隐式意图的差别


意图在android的应用开发中是非常重要的。明确了意图的作用和使用后,对开发会有非常大帮助。假设没有把意图搞懂。以后开发应用会感觉缺些什么。

  
    意图的作用:   
    1、激活组件  
 
    2、携带数据   
    3、意图的匹配(运用到隐式意图)  
 
    android主要的设计理念是鼓舞降低组件间的耦合,因此android提供了Intent(意图),用意图激活其它组件。

Intent提供了一种通用的消息系统,它同意在你的应用程序与其它应用程序间传递Intent来运行和产生事件。使用Intent能够激活android应用的三个核心组件:活动、服务和广播接收器。Intent代表了要运行的某一种想法。要干的某一件事情。

  
    意图可划分为显式意图和隐式意图。  
 
    显式意图:调用Intent.setComponent()或Intent.setClass()方法明白指定了组件名得Intent为显式意图。显式意图明白指定了Intent应该传递给那个组件。   
    如:Intent intent = new Intent();  
 
        intent.setAction(Activity1.this,Activity2.class);   
        startActivity(intent);   
        显式意图非常easy。此处就不再赘述。

 
 
    隐式意图:没有明白指定组件名得Intent为隐式意图。android系统会依据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。  
 
  如调用电话拨号:Intent intent = new Intent();  
 
                  intent.setAction("android.intent.action.CALL");  
 
                  intent.setData("Uri.parse("tel:") + mobile");//mobile为电话号码(是数字)   
                  startActivity(intent);  
 
    假设採用隐式意图来激活组件。是怎么样找到组件的?  
 
    解释:如。电话拨号器在定义的时候。意图过滤器(Intent-filter)是这样定义的  




   产品经理必学的五个锦囊妙计  产品方法  产品思维  产品设计  交互体验    
  




 
    <Intent-filter>   
        <action android:name="android.intent.action.CALL"/>   
        <category android:name"android.intent.category.DEFAULT"/>   
        <data android:scheme="tel"/>   
    </Intent-filter>  
 
       1、先是有一个动作名称。<action android:name="android.intent.action.CALL"/>是由拨号器内部定义的。自己开发的应用也能够自定义。

  
       2、类别,在代码中并没有设类别。原因:当我们调用startActivity方法将intent意图传给操作系统时,startActivity方法的内部会为intent这个意图加入进一个类别。这个类别就是android.intent.category.DEFAULT。  
 
      3、数据,数据包括两个方面。数据所代表的Uri和数据的类型。此例中没有数据的类型,仅仅有Uri,Uri又由scheme、主机名、路径三部分组成,对于Uri的匹配,仅仅要跟给定的某一部分匹配即可了,此例中仅仅要和scheme匹配即可。  
 
      此时,代码就能够和意图过滤器匹配了,因此,它就会调用这个过滤器所在的Activity,由此实现电话拨号功能。  
 
  那么,显式意图和隐式意图分别在什么场合使用呢?  
 
      显式意图一般在应用的内部使用,由于。在应用内部已经知道了组件的名称。直接激活即可了。  
 
      当一个应用要激活还有一个应用中的Activity时(看不到源码),仅仅能使用隐式意图。依据Activity配置的意图过滤器建一个意图,让意图中的各项參数的值都跟过滤器匹配,这样就能够激活其它应用中的Activity。所以,隐式意图是在应用与应用之间使用的。(假设自己开发的应用,希望当中的某个Activity能让其它应用訪问到,就为这个Activity定义一个意图过滤器,则。其它应用就能够依据意图过滤器中的參数设置意图对象,然后传给操作系统,操作系统就能够找到和这个意图匹配的过滤器,找到过滤器后就能够激活意图所在的Activity)   
以下举一个样例:  
 
在FirstActivity中点击button跳到SecondActivity中(用隐式意图):   
在AndroidManifest中   






  




<activity android:name=".SecondActivity"  android:label="@string/app_name">   
            <intent-filter>   
                <action android:name="cn.itcast.xiao.li" />   
                <action android:name="cn.itcast.xiao.zhang" />  
 
                <category android:name="android.intent.category.DEFAULT" />   
                <category android:name="cn.itcast.category.li" />   
                <data android:scheme="itcast" 
android:host="www.itcast.cn" 
android:path="/person"/>  
 
                <data android:mimeType="image/gif"/>   
            </intent-filter>    
 
代码:onCreate部分  
 
public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
         
 
        Button button = (Button) this.findViewById(R.id.button);   
        button.setOnClickListener(new View.OnClickListener() {   
            @Override   
            public void onClick(View v) {   
                Intent intent = new Intent();   
                intent.setAction("cn.itcast.xiao.li");   
                intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), 






  




"image/gif");  
 
                startActivity(intent);   
            }   
        });   
    }   
  
当中,action的name随便设,category的name也能够随便设。只是android.intent.category.DEFAULT是调用startActivity时内部自己主动生成的。  
 
    在意图过滤器中能够有多个动作和类别。但意图仅仅能定义一个动作,所以仅仅要定义的这个动作(action)和意图过滤器中的随意一个匹配就能够成功。

类别(category)也是。仅仅要匹配当中一个即可,不必匹配全部。

可是。假设定义的类别在意图过滤器中找不到。就会报错,也就是说意图中定义的动作和意图在过滤器中必须有。  
 
    注意:若intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");分开写,即:intent.setData(),intent.setType()(括号里的东西略)时,就算是都匹配也会报错。原因:在setType()文档中有一句话。This method automatically clears any data that was previously set by setData(Uri).也就是说。当设置了setType时会自己主动清除setData中的内容。

所以。解决方法:写成intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/person"), "image/gif");这样就正确了。 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM