Intent是Android中的重要組件,能夠被認爲是不一樣組件之間通訊的「媒介」或者「信使」。使用它能夠啓動Activity,Service還能夠發起一個廣播(Broadcast)。Intent對象由Action、Data、Category、Component和Extra組成。下面就以上屬性進行分析說明。android
1. Component瀏覽器
在使用Intent顯式的啓動目標組件時,須要指定組件的名稱(ComponentName)。Intent的組件名稱對象由ComponentName類來封裝。代碼以下:安全
-
- ComponentName cn = new ComponentName(MainActivity.this, "com.amaker.ch06.app1.MyActivity");
-
- Intent intent = new Intent();
-
- intent.setComponent(cn);
-
- startActivity(intent);
|
同時,在目標組件中,能夠得到傳過來的Intent的屬性。以下:
app
-
- Intent intent = this.getIntent();
-
- ComponentName cn = intent.getComponent();
-
- String packageName = cn.getPackageName();
-
- String className = cn.getClassName();
-
- tv = (TextView)findViewById(R.id.TextView01);
-
- tv.setText("組件包名稱:"+packageName+"\n"+"組件類名稱:"+className);
|
除了使用setComponent() 以外,還可使用setClass(),setClassName()來顯式指定目標組件。
2. Actionide
Action規定了Intent要完成的動做,是一個字符串常量。使用setAction()來設置Action屬性,使用getAction()來得到Action屬性。既可使用系統內置的Action,也能夠本身定義。
自定義Action:
測試
- public static final String MY_ACTION="com.amaker.ch07.app.MY_ACTION";
- ......
- Intent intent = new Intent();
-
- intent.setAction(MY_ACTION);
-
- startActivity(intent);
|
對於使用自定義的Action的隱式發送組件的過程當中,須要在目標組件的AndroidManifest.xml中聲明過濾器規則,將Action加入其中。以下:
- <intent-filter>
- <action android:name="com.amaker.ch06.app.MY_ACTION" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
|
訪問系統的Action方法同上,區別在於無需自定義Action字符串,直接使用系統內部的就能夠,此處再也不贅述。
3. Intent的Data和Type屬性this
不一樣的動做伴隨着不一樣種類的數據規格。setData()方法指定數據只能爲一個URI,setType()指定它只能是一個MIME類型, 而setDataAndType()指定它同時爲URI和MIME類型。URI經過getData()讀取,類型則經過getType()。
當匹配一個意圖到一個能處理數據的組件時,除了它的URI外,一般須要知道數據類型(它的MIME類型)。 好比,一個能顯示圖片的組件不該該被要求去播放一個聲音文件。以下:google
- <data android:type="video/mpeg" android:scheme="http" . . . />
- <data android:type="audio/mpeg" android:scheme="http" . . . />
|
下面代碼是開啓打電話界面的程序片斷:
- data="content://contacts/people/1";
- uri=Uri.parse(data);
- intent=new Intent();
- intent.setData(uri);
- intent.setAction(Intent.ACTION_VIEW);
- startActivity(intent);
|
下面的代碼是Type類型的數據的訪問:spa
- Intent intent=new Intent();
- intent.setType("vnd.android.cursor.item/phone");
- intent.setAction(Intent.ACTION_GET_CONTENT);
- startActivity(intent);
- break;
|
4. Categoryxml
該屬性是一個執行Action的附件信息。能夠看做是設置一些特性的設置。
常量
|
含義
|
CATEGORY_BROWSABLE
|
目標活動能夠被瀏覽器安全的喚起來顯示被一個連接所引用的數據-好比,一張圖片或一條e-mail消息。
|
CATEGORY_GADGET
|
這個活動能夠被嵌入到充當配件宿主的另外的活動裏面。
|
CATEGORY_HOME
|
這個活動將顯示桌面,也就是用戶開機後看到的第一個屏幕或者按HOME鍵時看到的屏幕。
|
CATEGORY_LAUNCHER
|
這個活動能夠是一個任務的初始活動並被列在應用程序啓動器的頂層。
|
CATEGORY_PREFERENCE
|
目標活動是一個選擇面板。
|
5. Extra屬性
該屬性是添加一些組件的附加信息。代碼以下:
- Uri uri = Uri.parse("smsto://10086");
- Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
- intent.putExtra("sms_body", "測試短信");
- startActivity(Intent.createChooser(intent, "發送短信"));
|
以上程序片是發送短信的頁面出現,在其中的聯繫人和文本信息框中出現的是10086和「測試短信」。另外,使用Extra屬性也能夠向自定的其餘組件發送數據。在目標組件中能夠接收。代碼以下:
- Intent intent=getIntent();
- int user=intent.getIntExtra("userId",0);
|
6. Intent Filter
在不指定目標組件名稱的時候,須要使用隱式尋找目標組件的方法。,這就須要經過Intent Filter來實現。目標Intent在AndroidManifest.xml中的Intent Filter標籤中指定Action,Data和Category。而後源Activity經過查找已經註冊在AndroidManifest.xml中的全部Intent,最終找到匹配的Intent。聲明方法以下:
- <activity android:name="TestActivity" >
- <intent-filter>
- <action android:name="com.amaker.ch06.app.TEST_ACTION1"/>
- <action android:name="com.amaker.ch06.app.TEST_ACTION2"/>
- <action android:name="com.amaker.ch06.app.TEST_ACTION3"/>
-
- <action android:name="android.intent.action.VIEW"/>
-
- //Type和data屬性都在這個標籤中設置。URI被拆分紅兩個部分,scheme和path。
- <data android:scheme="content" android:path="com.amaker.ch07.app/abc"/>
- <data android:scheme="http" android:path="www.google.com" />
- //這行必須添加
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="com.amaker.ch07.app.CATEGORY1"/>
-
- </intent-filter>
- </activity>
-
|
在過濾器中,以下幾點須要注意: a. 若是Intent指定了Action,則目標組件中的過濾器Action列表中必須包含這個Action,不然不能匹配。若是Intent沒有指定,則自動經過。 b. android.intent.category.DEFAULT屬性是啓動Activity默認的屬性,這個必須添加。 c. 若是有多個Intent過濾規則相同,那麼會自動提示使用哪一個。 d. 若是一個組件沒有任何的意圖過濾器,那它只能接收顯式意圖。一個帶過濾器的組件能夠同時接收顯式和隱式意圖。