1. 程式人生 > >Android學習記錄(7)—Intent中顯示意圖和隱式意圖的用法

Android學習記錄(7)—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)這個方法。
轉載註明出處:http://blog.csdn.net/loongggdroid/article/details/17887975

相關推薦

Android學習記錄7Intent顯示意圖意圖用法

Intent(意圖)主要是解決Android應用的各項元件之間的通訊。 Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的元件,將 Intent傳遞給呼叫的元件,並完成元件的呼叫。 因此,Intent在這裡起著一個媒體中介的作用,專

Android學習記錄1AndroidXML檔案的序列化生成與解析

xml檔案是非常常用的,在android中json和xml是非常常用的兩種封裝資料的形式,從伺服器中獲取資料也經常是這兩種形式的,所以學會生成和解析xml和json是非常有用的,json相對來說是比較簡單的,咱不做介紹了,這裡給大家講一下xml的序列化生成和解析。不廢話了,

【機器人學】機器人開源專案KDL原始碼學習7examples的CMakeList.txt檔案解讀

通過學習KDL開源專案的程式碼可以學習CMake構建程式的知識,現簡單介紹一下orocos_kinematics_dynamics-master\orocos_kinematics_dynamics-master\orocos_kdl\examples\CMakeList.txt檔案的指令。

C語言學習記錄7時間格式轉換

C語言學習記錄 學習OJ上的C語言題 時間格式轉換 題目描述 編寫一個程式,要求使用者輸入24小時制的時間,然後按照12小時制的格式顯示出來。 提示: hours == 0時,顯示12:MM AM hours < 12時,顯示HH:MM AM hours

Thymeleaf學習記錄7--頁面引入/片段引入

1.為頁面新增footer: Templates資料夾下新建HTML檔案: 1 <!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd"> 2 3 <html xml

kubernetes學習記錄7——彈性伸縮與滾動升級

彈性伸縮 彈性伸縮是指適應負載變化,以彈性可伸縮的方式提供資源。 Pod的彈性伸縮就是修改Replication Controller的Pod副本數。可以通過Kubectl scale命令實現。 建立Replication Controller te

Pro Android學習筆記——Intent

Intent 簡介 Android中使用Intent來呼叫元件,Android中的元件包括Activity,Service,Broadcast Receiver,Content Provider。Android將多種理念融入到了Intent的概念中。可以使用Intent從一個應用程式中呼

python 學習記錄7-迴圈/結構化程式氣泡排序

1.1 while 迴圈 #!/usr/bin/python # -*- coding: UTF-8 -*- i = 1 while i <10:     i = i + 1     print i      # while迴圈 numbers = raw_input

JAVA學習記錄————JAVA的集合類

數組 節點 唯一性 list 接口規範 hashcode 工具類 collect 上進 這個圖是總體的框架圖,主要是兩個接口Collection和Map都繼承接口Iterator(Iterable),為了實現可以使用叠代器。Collection和Map類似平級關系。

CentOS初步學習記錄Wget文件下載Sed文件處理

下載速度 file 文件 socket cut inux 調試 數據行 use mozilla 一、wget 命令 wget命令用來從指定的URL下載文件,wget非常穩定,它在帶寬很窄的情況下和不穩定網絡中有很強的適應性,如果是由於網絡的原因下載失敗,wget會不斷

JAVA基礎7---java的變數常量

資料在執行過程中,有的不會改變,有的會發生改變。變得就稱為變數  不變的就稱常量。 變數 變數:變數是Java程式中最基本的儲存單元  變數的屬性:變數名,資料型別,儲存單元和變數值 1、變數名:合法的識別符號 2、資料型別:可以是基本資料型別和引用資料型

SpringMVC學習系列7 之 格式化顯示

在系列(6)中我們介紹瞭如何驗證提交的資料的正確性,當資料驗證通過後就會被我們儲存起來。儲存的資料會用於以後的展示,這才是儲存的價值。那麼在展示的時候如何按照要求顯示?(比如:小數保留一定的位數,日期按指定的格式等)。這就是本篇要說的內容—>格式化顯示。 從Spring3.X開始,Spring提供了C

Android學習筆記整理8--Activity的顯意圖意圖

Android中Intent尋找目標元件的方式分為兩種,一種是顯式意圖,另一種是隱式意圖1.顯式意圖在通過Intent啟動Activity時,需要明確指定啟用元件的名稱。在程式中,如果需要在本應用中啟動

Python學習筆記14-Python的程序執行緒

1.多程序 1.1建立程序 Unix/Linux/Mac作業系統都可以使用fork()函式來建立子程序,分別在父程序和子程序內返回,例如 程式碼: import os # 匯入os模組 print ('當前程序的ID是:%s' % os.g

Android核心技術-day06-01-顯意圖意圖

package com.gaozewen.intent; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppC

Intent--顯示意圖意圖

一:顯示意圖 顯式意圖:呼叫Intent.setComponent()或Intent.setClass()方法明確指定了元件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個元件

Android學習筆記建立Menu,Intent的使用

//Test1.java package com.activitytest.testactivity2; import android.app.Activity; import android.app.IntentService; import android.conten

Mongodb 學習筆記 7通過純mongo語句,將資料庫的秒級時間戳,轉換成Date型別,並且裝換成任意時間格式

背景:在公司專案中,我們使用了秒級時間戳,作為時間資訊。但是mongodb自支援的多種時間處理函式,只針對date型別的欄位,於是我嘗試使用了mongo語句,將整型數的時間戳,通過mongo語句,轉換成date型別。 這裡使用的是aggregate(聚合),如下: db.t_merchant

機器學習筆記7——C4.5決策樹的缺失值處理

缺失值處理是C4.5決策樹演算法中的又一個重要部分,前面已經討論過連續值和剪枝的處理方法: 現實任務中,通常會遇到大量不完整的樣本,如果直接放棄不完整樣本,對資料是極大的浪費,例如下面這個有缺失值的西瓜樣本集,只有4個完整樣本。 在構造決策樹時,處理含有缺失值

Android Camera 流程學習記錄—— 碎碎念以及 Android 框架初識

碎碎念 到公司入職了快兩個月了。前一個月全是在公共培訓,其中有半個月還到某個子公司(手機生產工廠)去實習,體驗了生產最前線人民的日常生活…… 8 月開始才正式分配到軟體中心的工位上,然後又開始了新一輪的內部培訓,培訓的內容大概就是一些 Git 的使用