Android學習之Intent中顯示意圖和隱式意圖的用法執行個體分析_Android

來源:互聯網
上載者:User

本文執行個體講述了Android學習之Intent中顯示意圖和隱式意圖的用法。分享給大家供大家參考,具體如下:

Intent(意圖)主要是解決Android應用的各項組件之間的通訊。

Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。

因此,Intent在這裡起著一個媒體中介的作用,專門提供組件互相調用的相關資訊,實現調用者與被調用者之間的解耦。

例如,在一個連絡人維護的應用中,當我們在一個連絡人清單螢幕(假設對應的Activity為listActivity)上,點擊某個連絡人後,希望能夠跳出此連絡人的詳細資料螢幕(假設對應的Activity為detailActivity)

為了實現這個目的,listActivity需要構造一個 Intent,這個Intent用於告訴系統,我們要做“查看”動作,此動作對應的查看對象是“某連絡人”,然後調用startActivity (Intent intent),將構造的Intent傳入,系統會根據此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系統會調用找到的 Activity,即為detailActivity,最終傳入Intent,detailActivity則會根據此Intent中的描述,執行相應的操作。

對於intent主要的分類主要包括隱式意圖和顯式意圖。顯式意圖通常主要是啟動本應用中的Activity之間的資料,而隱式意圖則常見於啟動系統中的某些特定的動作,比如打電話,或者是跨應用的Activity啟動。

通常來說:

顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent為隱式意圖。 Android系統會根據隱式意圖中設定的動作(action)、類別(category)、資料(URI和資料類型)找到最合適的組件來處理這個意圖。

顯示意圖非常常用也非常簡單一般用於應用程式內之間Activity的相互調用轉換,就不多說了,這裡我介紹一下隱式意圖:

簡單概括就是: 意圖包括:Action(動作),Category(附加資訊),Data(資料,具體內容),Tpye(類型)等等,舉個例子,說白了意圖就是啟動一個組件的的完整的動作資訊,就像打人,打就是Action動作,人就是Data內容,而Type就是類型,打什麼人呢?打壞人,type就是壞指的類型,只有這些資訊全了才能執行一個完整的意圖,當然還有一些資訊,比如scheme就是URI類型的資料的首碼,就像這個例子當中的sms:,還有host主機名稱,path路徑等。

這裡我給大家舉一個調用系統簡訊的例子,使用隱式意圖啟動系統簡訊,並給10086發送資訊的例子。代碼如下:

/** * 隱式意圖的方法啟動系統簡訊 * * 簡單概括就是: 意圖包括:Action(動作),Category(附加資訊),Data(資料,具體內容),Tpye(類型)等等,舉個例子, * 說白了意圖就是啟動一個組件的的完整的動作資訊 * ,就像打人,打就是Action動作,人就是Data內容,而Type就是類型,打什麼人呢?打壞人,type就是壞指的類型 * ,只有這些資訊全了才能執行一個完整的意圖 * ,當然還有一些資訊,比如scheme就是URI類型的資料的首碼,就像這個例子當中的sms:,還有host主機名稱,path路徑等 * * @param view */ public void startOne(View view) {   Intent intent = new Intent();   intent.setAction("android.intent.action.SENDTO");// 發送資訊的動作   intent.addCategory("android.intent.category.DEFAULT");// 附加資訊   intent.setData(Uri.parse("sms:10086"));// 具體的資料,發送給10086   startActivity(intent); }

上邊的這個例子是調用系統的東西,下邊我們來看看自訂的隱式意圖是怎麼調用的。
首先是先在資訊清單檔中進行註冊,代碼如下:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="net.loonggg.intent"  android:versionCode="1"  android:versionName="1.0" >  <uses-sdk   android:minSdkVersion="8"   android:targetSdkVersion="17" />  <application   android:allowBackup="true"   android:icon="@drawable/ic_launcher"   android:label="@string/app_name"   android:theme="@style/AppTheme" >   <activity    android:name="net.loonggg.intent.MainActivity"    android:label="@string/app_name" >    <intent-filter>     <action android:name="android.intent.action.MAIN" />     <category android:name="android.intent.category.LAUNCHER" />    </intent-filter>   </activity>   <activity android:name="net.loonggg.intent.SecondActivity" >    <intent-filter>     <!-- 自訂的動作 -->     <action android:name="net.loonggg.xxx" />     <!-- 自訂的scheme和host -->     <data      android:host="www.baidu.com"      android:path="/person"      android:scheme="loonggg" />     <!-- 自訂的類型 -->     <data android:mimeType="person/people" />     <!-- 附加資訊 -->     <category android:name="android.intent.category.DEFAULT" />    </intent-filter>   </activity>  </application> </manifest>

第二個Activity裡的東西就是我們自訂設定的,就是下邊的這段代碼:

<activity android:name="net.loonggg.intent.SecondActivity" >  <intent-filter>   <!-- 自訂的動作 -->   <action android:name="net.loonggg.xxx" />   <!-- 自訂的scheme和host -->   <data    android:host="www.baidu.com"    android:path="/person"    android:scheme="loonggg" />   <!-- 自訂的類型 -->   <data android:mimeType="person/people" />   <!-- 附加資訊 -->   <category android:name="android.intent.category.DEFAULT" />  </intent-filter> </activity>

那在代碼中怎麼調用自訂的呢?其實跟調用系統簡訊一樣,只不過調用系統簡訊裡的那些動作和資料,系統已經給我們配置好了,我們直接用就行,而自訂的就是我們自己寫的,調用方法和系統其實是一樣的。方法如下:

/** * 通過自訂的隱式意圖啟動 * * @param view */ public void startTwo(View view) {   Intent intent = new Intent();   intent.setAction("net.loonggg.xxx");   intent.addCategory("android.intent.category.DEFAULT");   intent.setDataAndType(Uri.parse("loonggg://www.baidu.com/person"),     "person/people");   startActivity(intent); }

特別注意的一點是:intent.setData(data)和intent.setType(type)注意這兩個方法會互相清除,意思就是:如果先設定setData(data)後設定setType(type),那麼後設定的setType(type)會把前面setData(data)設定的內容清除掉,而且會報錯,反之一樣,所以如果既要設定類型與資料,那麼使用setDataAndType(data,type)這個方法。

希望本文所述對大家Android程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.