Android學習筆記33:Intent介紹及Intent在Activity中的使用方法

來源:互聯網
上載者:User

  本篇博文主要介紹Intent的相關概念,以及Intent在Activity中的使用方法。

 

1.Intent的實現過程

  在Android中,Intent不僅可用於應用程式之間的互動,也可用於應用程式內部的Activity/Service之間的互動。

  Intent負責對應用中一次操作進行描述,描述內容包括動作以及動作所涉及的資料,Android中的Intent機制則根據此描述,找到對應的組件,將Intent傳遞給該被調用組件,完成對組件的一次調用。

  這便是Intent的實現過程,可見,在Intent中提供了組件互相調用的相關資訊,實現了調用者與被調用者之間的解耦。

2.Intent的應用場合

  歸納起來,Intent的應用場合主要有以下三種:

2.1啟動一個Activity

  (1)Activity.startActivity(Intent intent);  //啟動一個Activity

  (2)Activity.startActivityForResult(Intent intent, int requestCode);  //啟動一個帶請求碼的Activity,當該Activity結束時將回調原Activity的onActivityResult()方法,並返回一個結果碼。

2.2啟動一個Service

  (1)Context.startService(Intent service); 

  (2)Context.bindService(Intent service, ServiceConnection conn, int flags); 

2.3啟動一個Broadcast

  (1)sendBroadcast(Intent intent); 

     sendBroadcastAsUser(Intent intent, UserHandle user); 

  (2)sendStickyBroadcast(Intent intent); 

         sendStickyBroadcastAsUser(Intent intent, UserHandle user); 

  (3)sendOrderedBroadcast(Intent intent, String receiverPermission); 

      sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,

 BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData, Bundle initialExtras); 

 

3.Intent屬性設定

  Intent的屬性設定包括:Action(要執行的動作)、Data(執行動作所操作的資料)、Type(顯式的指定Intent的資料類型)、Category(執行動作的附加資訊)、Component(指定Intent目標組件的類名稱)、Extras(其它所有附加資訊的集合)。    

3.1 Action(要執行的動作)

  在SDK中定義了一系列標準動作,其中的一部分1所示。

圖1 部分標準動作

  其中,ACTION_CALL表示調用撥打到電話的應用;ACTION_EDIT表示調用編輯器;ACTION_SYNC表示同步資料。

3.2 Data(執行動作所操作的資料)

  在Intent中,Data使用指向資料的URI來表示。比如,在連絡人應用中,指向連絡人清單的URI是content://contacts/people/。

3.3 Type(顯式的指定Intent的資料類型)

  對於不同的動作,其URI資料的類型是不同的。

  通常,Intent的資料類型能夠根據其資料本身進行判定,但是通過設定這個屬性,可以強制採用顯式指定的類型。

3.4 Category(執行動作的附加資訊)

  Category表示執行動作的附加資訊。比如,當我們想要讓所執行的動作被接收後,作為頂級應用而位於其他所有應用的最上層,並可以使用附加資訊LAUNCHER_CATEGORY來實現。 

3.5 Component(指定Intent目標組件的類名稱)

  Component用於指定Intent目標組件的類名稱。通常,Android會根據Intent 中所包含的其它屬性資訊(比如Action、Data/Type、Category)進行尋找,並找到一個與之匹配的目標組件。但是,如果我們設定了Component屬性,明確的指定了Intent目標組件的類名稱,那麼上述尋找過程將不需要執行。 

3.6 Extras(其它所有附加資訊的集合)

  使用extras可以為組件提供擴充資訊。

4.Intent解析過程

  在使用Intent時,根據是否明確的指定Intent對象的接收者,而分為兩種情況。一種是顯式的Intent,即在構造Intent對象時就指定其接收者;另一種是隱式的Intent,即在構造Intent對象時,並不指定其接收者。

  對於顯式的Intent來說,Android不需要解析Intent,因為目標組件已經很明確。對於隱式的Intent來說,Android需要對其進行解析,通過解析,將Intent映射給可以處理該Intent的Activity、Service或Broadcast。        

  Intent解析機制是通過尋找註冊在AndroidManifest.xml檔案中的所有IntentFilter,以及IntentFilter所定義的Intent,找到最匹配的Intent。

  在解析過程中,Android通過判斷Intent的Action、Type、Category這三個屬性,從而找出最匹配的Intent,具體的判斷方法如下:

  (1)如果Intent指明了Action,則目標組件IntentFilter的Action列表中就必須包含有這個Action,否則不能匹配;

  (2)如果Intent沒有提供Type,系統將從Data中得到資料類型。目標組件的資料類型列表中必須包含Intent的資料類型,否則不能匹配。

  (3)如果Intent中的資料不是content: URI,而且Intent也沒有明確指定它的Type,將根據Intent中資料的scheme (比如 http: 或者mailto:) 進行匹配。同理,Intent 的scheme必須出現在目標組件的scheme列表中,否則不能匹配。

  (4)如果Intent指定了一個或多個Category,這些類別必須全部出現在目標組件的類別列表中,否則不能匹配。

 

5.Intent使用執行個體

  下面介紹幾個使用Intent的執行個體。

5.1調用其他的應用

  通過Intent可以調用並啟動別的應用程式,比如調用撥打到電話的程式,便可以使用如下的方法來完成:

 1   /* 2   * Function :  調用撥打到電話的程式 3   * Author   :  部落格園-依舊淡然 4   */ 5   public void intentDemo_Call() { 6       Intent intent_call = new Intent();                //建立一個意圖 7       intent_call.setAction(Intent.ACTION_CALL);        //設定意圖為打電話 8       intent_call.setData(Uri.parse("tel:110"));        //設定電話號碼 9       startActivity(intent_call);                       //啟動意圖10   }

  當然了,因為這裡使用到了打電話的功能,我們還需要在AndroidManifest.xml檔案中,添加申請打電話的資源許可權,具體實現方法如下:

1   <!-- 打電話的許可權 -->2     <uses-permission 
      android:name="android.permission.CALL_PHONE" />

  有關Android中的許可權請求可以參閱《Android資料手冊02:android.permission許可權請求匯總》。

5.2跳轉到另一個Activity

  通過使用Intent不僅可以調用別的應用程式,還可以實現應用程式內部之間Activity的跳轉。比如如下的代碼便實現了從MainActivity跳轉到SecondaryActivity,並向SecondaryActivity中傳遞了兩個資料name和age。

 1     /* 2      * Function  :  跳轉到SecondaryActivity  3      * Author    :  部落格園-依舊淡然 4      */ 5     public void intentDemo_GoToSecondaryActivity() { 6         Intent intent_toSecondary = new Intent();                      //建立一個意圖 7         intent_toSecondary.setClass(this, SecondaryActivity.class);    //指定跳轉到SecondaryActivity 8         intent_toSecondary.putExtra("name", "jack");                   //設定傳遞內容name 9         intent_toSecondary.putExtra("age", 23);                        //設定傳遞內容age10         startActivity(intent_toSecondary);                             //啟動意圖11     }

  那麼,如何在SecondaryActivity中接收從MainActivity中傳過來的內容(name、age)呢?下面的代碼給出了一種實現方案。

 1   /* 2      * Function  :  接收mainActivity中的intent_toSecondary 3      * Author    :  部落格園-依舊淡然 4      */ 5     public void acceptIntent() { 6         Intent intent_accept = getIntent();           //建立一個接收意圖 7         Bundle bundle = intent_accept.getExtras();    //建立Bundle對象,用於接收Intent資料 8         String name = bundle.getString("name");       //擷取Intent的內容name 9         int age = bundle.getInt("age");               //擷取Intent的內容age10     }

5.3發送一個帶回調方法的意圖

  有時,我們可能需要通過定義在MainActivity中的某一控制項來啟動SecondaryActivity,並且當SecondaryActivity結束時,返給MainActivity一個執行結果。

  要實現上述的功能,只需要完成以下三步驟即可。

  (1)在MainActivity中實現向SecondaryActivity發送帶請求碼的意圖,具體實現方法如下:

1   /*2      * Function  :  向SecondaryActivity發送帶請求碼的意圖3      * Author    :  部落格園-依舊淡然4      */5     public void intentDemo_request() {6         Intent intent_request = new Intent();                      //建立一個意圖7         intent_request.setClass(this, SecondaryActivity.class);    //指定跳轉到SecondaryActivity8         startActivityForResult(intent_request, REQUEST_CODE);      //啟動帶請求碼意圖9     }

  (2)在SecondaryActivity中接收intent_request,並向意圖中填充要返給MainActivity的內容,最後還需要設定一個返回碼。具體的實現方法如下:

 1   /* 2      * Function  :  接收mainActivity中的intent_request並返回一個結果碼 3      * Author    :  部落格園-依舊淡然  4      */ 5     public void acceptIntentAndReturn() { 6         Intent intent = getIntent();                           //建立一個接收意圖 7         intent.putExtra("back", "data of SecondaryActivity");  //設定意圖的內容 8         setResult(RESULT_CODE, intent);                        //設定結果碼 9         finish();                                              //結束SecondaryActivity,並返回MainActivity10     }

  (3)當結束SecondaryActivity時,程式將返回到MainActivity介面。此時,MainActivity中的onActivityResult()方法將被回調,而我們要做的就是實現該方法。在本樣本中,該方法的具體實現方法如下:

 1   /* 2      * Function  :  onActivityResult回調方法 3      * Author    :  部落格園-依舊淡然 4      */ 5     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 6         if(requestCode == REQUEST_CODE && resultCode == SecondaryActivity.RESULT_CODE) { 7             Bundle bundle = data.getExtras(); 8             String str = bundle.getString("back"); 9             Toast.makeText(this, "從SecondaryActivity的傳回值為:" + str, Toast.LENGTH_LONG).show();10         }11     }

  以上的代碼,我們通過判斷requestCode和resultCode便可以唯一的確定MainActivity中的調用者和SecondaryActivity中的被調用者,建立起了一一對應的關係。並且,我們通過Bundle對象擷取了從SecondaryActivity中返回給MainActivity的內容,並通過Toast進行了輸出,2所示。

圖2 從SecondaryActivity中返回的內容

  由圖2可見,從SecondaryActivity中返回的內容正是我們在SecondaryActivity中定義的字串“data of SecondaryActivity”。

6.總結

  本篇博文主要介紹了Intent的相關概念,以及Intent在Activity中的三種使用方法。有關Intent在Service和Broadcast中的使用方法,將在後續的Service和Broadcast的學習過程中再做介紹。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.