Intent 是一個將要執行的動作的抽象的描述,一般來說是作為參數來使用,由Intent來協助完成android各個組件之間的通訊。Android中的Intent可以理解為不同組件通訊的媒介或者信使。所以Intent的主要作用就是調用起來一個Activity或者Service等。
意圖分為顯和隱式意圖。一般對於顯使用是比較方便的,如果我們調用的使我們自己的Activity,則可以直接啟動就可以了,如果調用的是其他的Activity,這時候我們就需要擷取到我們要啟動的Activity的包名和類名,然後調用。
對於自己寫的Activity可以按照如下方法調用:
Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);
如果需要調用別人的Activity,我們需要確定包名類名。但是有時候我們不清楚Activity的包名類名,這時候我們需要在裝置上或者模擬器上點擊一下我們想要調用的Activity,這裡以瀏覽器為例,這時候在logcat中會列印出如下輸出:
02-24 23:11:19.652: I/ActivityManager(61): Starting: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.browser/.BrowserActivity } from pid 137
這時候我們需要關注的是cmp=com.android.browser/.BrowserActivity,通過這個我們能夠確定包名為com.android.browser,類名為com.android.browser.BrowserActivity,這時候就可以通過如下代碼調用起Activity:
Intent intent = new Intent();intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");startActivity(intent);上面介紹的都是顯,但是顯也有其缺點,如果我們調用別人的Activity,如果別人的包名類名改了,這時候我們調用就會失敗,為了應對這種情況,Android中提供的隱式意圖,對於隱式意圖我們在調用的時候需要給我們的Intent配置很多參數,然後Android系統會根據這些參數去調用對應的Activity(對於隱式意圖的詳細解釋,還請百度)。如果某個Activity想通過隱式意圖的方式被調用,必須在其AndroidManifest.xml中配置對應的參數,我這裡有一個配置例子如下:
這裡配置了一個Activity,並且使其能夠通過隱式意圖調用,下面是調用的代碼:
Intent intent = new Intent(); intent.setAction("com.mxy.intenttest"); /**添加類別:startActivity(intent)啟動Activity時會自動添加 * android.intent.category.DEFAULT類別,所以需要在Manifest中 * 配置該類別.但在程式中不需要明確添加該類別 * 只有當Intent請求中所有的Category與組件中某一個IntentFilter的完全符合時, * 才會讓該 Intent請求通過測試,IntentFilter中多餘的聲明並不會導致匹配失敗。 * 一個沒有指定任何類別測試的 IntentFilter僅僅只會匹配沒有設定類別的Intent請求。*/ // intent.addCategory("android.intent.category.DEFAULT"); /**設定資料:API中說這個方法會將setType的方法設定的類型清除掉*/ intent.setData(Uri.parse("http://www.andyidea.com:8080/person")); /**設定類型:API中說這個方法會將setData上面的方法設定的資料清除掉*/ intent.setType("vnd.androd.cursor.item/test"); /**同時設定資料和類型:如果Intent過濾器中同時包含資料和資料類型的設定 * 就只能使用該方式來設定資料和類型*/ intent.setDataAndType(Uri.parse("http://www.andyidea.com:8080/person"), "vnd.androd.cursor.item/test"); startActivity(intent);上面的代碼是調用自己寫的Activity,其實Android系統也提供了很多的隱式意圖供我們調用,下面就是一個例子:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent);
介紹完了意圖,同時在兩個Activity的切換的過程中經常會涉及到傳值,對於傳值同樣也需要使用Intent。如果我們想把一個值傳遞到待啟動的Activity中,需要按照如下格式寫:
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("name", "mengxiangyue"); startActivity(intent);然後在啟動的Activity中使用如下代碼接收傳遞過來的值:
Intent intent = this.getIntent();String name = "";if(intent.getExtras() != null){name = intent.getExtras().getString("name");Toast.makeText(this, name, Toast.LENGTH_LONG).show();}
傳值做到了,有時候我們還希望被啟動的Activity關閉的時候,傳遞某些值給調用它的Activity。這時候我們需要在調用的時候使用如下代碼:
Intent intent = new Intent(this, ThirdActivity.class); intent.putExtra("name", "mengxiangyue"); startActivityForResult(intent, 1);// 1代表請求碼在被啟動的Activity執行如下代碼:
Intent intent = new Intent(this, SecondActivity.class);intent.putExtra("back", "這是返回的值");setResult(2,intent);finish();這時候資料傳遞迴來了,需要在Activity中接收,這時候需要實現如下方法:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {System.out.println("requestCode:" + requestCode + " resultCode:" + resultCode + " data:" + data.getStringExtra("back"));Toast.makeText(this, data.getStringExtra("back"), Toast.LENGTH_LONG).show();super.onActivityResult(requestCode, resultCode, data);}該方法接收requestCode,resultCode兩個參數,這兩個參數可以唯一的確定某次請求對應的結果,防止返回的結果發生混亂。
例子工程的:http://download.csdn.net/detail/mengxiangyue/7242667