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