国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Intent介紹及Intent在Activity中的使用方法

2019-11-09 17:33:29
字體:
來源:轉載
供稿:網友
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可以調用并啟動別的應用程序,比如調用撥打電話的程序,便可以使用如下的方法來完成:/*  * Function :  調用撥打電話的程序  * Author   :  博客園-依舊淡然  */  public void intentDemo_Call() {      Intent intent_call = new Intent();                //創建一個意圖      intent_call.setAction(Intent.ACTION_CALL);        //設置意圖為打電話      intent_call.setData(Uri.parse("tel:110"));        //設置電話號碼      startActivity(intent_call);                       //啟動意圖  }復制代碼當然了,因為這里使用到了打電話的功能,我們還需要在AndroidManifest.xml文件中,添加申請打電話的資源權限,具體實現方法如下: <!-- 打電話的權限 -->2     <uses-permission       android:name="android.permission.CALL_PHONE"    />復制代碼有關Android中的權限請求可以參閱《Android數據手冊02:android.permission權限請求匯總》。5.2跳轉到另一個Activity  通過使用Intent不僅可以調用別的應用程序,還可以實現應用程序內部之間Activity的跳轉。比如如下的代碼便實現了從MainActivity跳轉到SecondaryActivity,并向SecondaryActivity中傳遞了兩個數據name和age。/*      * Function  :  跳轉到SecondaryActivity       * Author    :  博客園-依舊淡然      */     public void intentDemo_GoToSecondaryActivity() {         Intent intent_toSecondary = new Intent();                      //創建一個意圖         intent_toSecondary.setClass(this, SecondaryActivity.class);    //指定跳轉到SecondaryActivity         intent_toSecondary.putExtra("name", "jack");                   //設置傳遞內容name         intent_toSecondary.putExtra("age", 23);                        //設置傳遞內容age         startActivity(intent_toSecondary);                             //啟動意圖     }復制代碼 那么,如何在SecondaryActivity中接收從MainActivity中傳過來的內容(name、age)呢?下面的代碼給出了一種實現方案。/*      * Function  :  接收mainActivity中的intent_toSecondary      * Author    :  博客園-依舊淡然      */     public void acceptIntent() {         Intent intent_accept = getIntent();           //創建一個接收意圖         Bundle bundle = intent_accept.getExtras();    //創建Bundle對象,用于接收Intent數據         String name = bundle.getString("name");       //獲取Intent的內容name         int age = bundle.getInt("age");               //獲取Intent的內容age     }復制代碼5.3發送一個帶回調方法的意圖

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

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

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

/*      * Function  :  向SecondaryActivity發送帶請求碼的意圖      * Author    :  博客園-依舊淡然      */     public void intentDemo_request() {         Intent intent_request = new Intent();                      //創建一個意圖         intent_request.setClass(this, SecondaryActivity.class);    //指定跳轉到SecondaryActivity         startActivityForResult(intent_request, REQUEST_CODE);      //啟動帶請求碼意圖     }復制代碼

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

/*      * Function  :  接收mainActivity中的intent_request并返回一個結果碼      * Author    :  博客園-依舊淡然       */     public void acceptIntentAndReturn() {         Intent intent = getIntent();                           //創建一個接收意圖         intent.putExtra("back", "data of SecondaryActivity");  //設置意圖的內容         setResult(RESULT_CODE, intent);                        //設置結果碼         finish();                                              //結束SecondaryActivity,并返回MainActivity     }復制代碼
3)當結束SecondaryActivity時,程序將返回到MainActivity界面。此時,MainActivity中的onActivityResult()方法將被回調,而我們要做的就是實現該方法。在本示例中,該方法的具體實現方法如下:/*      * Function  :  onActivityResult回調方法      * Author    :  博客園-依舊淡然      */     PRotected void onActivityResult(int requestCode, int resultCode, Intent data) {         if(requestCode == REQUEST_CODE && resultCode == SecondaryActivity.RESULT_CODE) {             Bundle bundle = data.getExtras();             String str = bundle.getString("back");             Toast.makeText(this, "從SecondaryActivity的返回值為:" + str, Toast.LENGTH_LONG).show();         }     }復制代碼 以上的代碼,我們通過判斷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的學習過程中再做介紹。

原文鏈接:http://www.cnblogs.com/menlsh/archive/2013/03/30/2991111.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 革吉县| 靖安县| 许昌市| 前郭尔| 夏河县| 兴仁县| 祥云县| 连州市| 炉霍县| 新宁县| 衡南县| 双城市| 宁陵县| 吴堡县| 博爱县| 闵行区| 屏东县| 合山市| 土默特左旗| 石台县| 周宁县| 静海县| 东乡县| 沙湾县| 云阳县| 呼伦贝尔市| 土默特右旗| 龙口市| 大渡口区| 屯门区| 汉源县| 峨眉山市| 张家界市| 房山区| 宁海县| 八宿县| 阿图什市| 上高县| 卓资县| 二连浩特市| 房产|