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);   
        顯式意圖很簡單,此處就不再贅述。  
 
    隱式意圖:沒有明確指定組件名得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中點擊按鈕跳到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