Intent代表了Android應用的啟動“意圖”,Android應用將會根據Intent來啟動指定組件,至於到底啟動哪個組件,取決於Intent的各個屬性。
一、顯式的Intent
明確指定了要啟動的組件的Intent我們稱為顯式的Intent
例如:
Java代碼
- package com.example.testintent;
-
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
-
- public class MainActivity extends Activity {
- Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View arg0) {
- ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);
- Intent intent = new Intent();
- intent.setComponent(comp);
- startActivity(intent);
- }
- });
- }
- }
注意在manifest文件裡注冊SecondActivity
Intent的Componet屬性需要接收一個ComponentName對象,ComponetName對象其實是一個指定包和要啟動的Activity路徑的類,有如下幾個構造
Java代碼
- componentName(String pkg, String cls)
-
- componentName(Context pkg, String cls)
-
- componentName(Context pkg, Class<?> cls)
componentName(Parcel in)
除了這個屬性之外Intent還包含了如下三個方法:
Java代碼
- setClass(Context packageContext, Class<?> cls )
-
- setClassName(Context packageContext, String className)
-
- setClassName(String packageName, String className )
上面的代碼可以簡化為如下代碼:
Java代碼
- Intent intent = new Intent(MainActivity.this, SecondActivity.class);
- startActivity(intent);
二、隱式的Intent
沒有明確指定要啟動的組件的Intent我們稱為隱式的Intent
Intent除了上面的Componet屬性外還有Action、Category屬性
Action代表Intent所要完成的一個抽象動作,而Category則是動作附加的類別信息。
例如:
Java代碼
- package com.example.testintent;
-
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
-
- public class MainActivity extends Activity {
- Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setAction("com.example.intent.action.TEST_ACTION");
- startActivity(intent);
- }
- });
- }
- }
manifest文件中配置
Java代碼
- <activity
- android:name=".SecondActivity">
- <intent-filter >
- <action android:name="com.example.intent.action.TEST_ACTION"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
一個Intent只能指定一個Action屬性,可以包含多個Category屬性,當程序創建時,默認啟動category為DEFAULT的組件。
接下來我們來看看Category屬性的用法
Java代碼
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setAction("com.example.intent.action.TEST_ACTION");
- intent.addCategory("android.intent.category.TEST_CATEGERY");
- startActivity(intent);
- }
manifest文件中配置
Java代碼
- <activity
- android:name=".SecondActivity">
- <intent-filter >
- <action android:name="com.example.intent.action.TEST_ACTION"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="android.intent.category.TEST_CATEGERY"/>
- </intent-filter>
- </activity>
可以看出其實是根據Action和Category兩個屬性共同決定啟動哪個Activity的,Category可以有多個,只要滿足其中的一個即可。
實際上Intent不僅可以啟動我們定義的Activity,也可以啟動系統和其他應用的Activity
ACTION_MAIN 應用程序入口
ACTION_VIEW 顯示指定數據
ACTION_ATTACH_DATA 指定某塊數據將被附加到其他地方
ACTION_EDIT 編輯指定數據
ACTION_PICK 從列表中選擇某項,並返回所選數據
ACTION_CHOOSER 顯示一個Activity選擇器
ACTION_GET_CONTENT 讓用戶選擇數據,並返回所選數據
ACTION_DIAL 顯示撥號面板
ACTION_CALL 直接向指定用戶打電話
ACTION_SEND 向其他人發送數據
ACTION_SENDTO 向其他人發送消息
ACTION_ANSWER 應答電話
ACTION_INSERT 插入數據
ACTION_DELETE 刪除數據
ACTION_RUN 運行數據
ACTION_SYNC 執行數據同步
ACTION_PICK_ACTIVITY 用於選擇Activity
ACTION_SEARCH 執行搜索
ACTION_WEB_SEARCH 執行web搜索
ACTION_FACTORY_TEST 工廠測試的入口點
這裡僅列出部分更多關於Action和Category屬性請參閱:http://developer.android.com/reference/android/content/Intent.html
三、一個獲取通訊錄的實例:
Java代碼
- package com.example.testintent;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.provider.ContactsContract.Contacts;
- import android.support.v4.content.CursorLoader;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
-
- public class MainActivity extends Activity {
- private static final String TAG = "MainActivity";
- Button button;
- final int PICK_CONTACT = 0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- button.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View arg0) {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_GET_CONTENT);
- intent.setType("vnd.android.cursor.item/phone");
- startActivityForResult(intent, PICK_CONTACT);
- }
- });
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- switch (requestCode) {
- case PICK_CONTACT:
- if(resultCode == Activity.RESULT_OK){
- //獲取返回數據
- Uri contactData = data.getData();
- CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);
- Cursor cursor = cursorLoader.loadInBackground();
- if(cursor.moveToFirst()){
- String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
- String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
- Log.i(TAG, "姓名:" + name);
- //根據聯系人查看詳細信息
- Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
- if(phones.moveToFirst()){
- System.out.println("進來了");
- String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
- Log.i(TAG, "電話:" + phoneNumber);
- }
- //關閉游標
- phones.close();
- }
- //關閉游標
- cursor.close();
- }
- break;
-
- default:
- break;
- }
- }
- }