《第一行代碼——Android》郭霖著java
更多內容,請訪問個人我的博客醒島android
Intent是Android程序中各組件之間進行交互的一種重要方式,它不只能夠指明當前組件想要執行的動做,還能夠在不一樣組件之間傳遞數據。Intent通常可被用於啓動活動、啓動服務、以及發送廣播等場景。瀏覽器
An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service. app
An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.ide
在ActivityTest中再建立一個活動SecondActivity,咱們可使用默認的模板,new→Actyvity→Empty Activity。佈局文件自動生成,爲activity_second.xml。使用此方法建立Activity,系統會自動生成java文件(默認繼承AppCompatActivity類,並已經配置好佈局文件),xml佈局文件,並在AndroidManifest.xml中爲此活動進行註冊。在佈局中增長一個Button,代碼以下:函數
<Button android:id="@+id/button_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button 2" />
顯式Intent的使用。Intent有多個構造函數的重載,其中一個是Intent(Context packageContext, Class<?> cls)。這個構造函數接收兩個參數,第一個參數Context要求提供一個啓動活動的上下文,第二個參數Class則是指定想要啓動的目標活動,經過這個構造函數就能夠構建出Intent的「意圖」。而後咱們應該怎麼使用這個Intent呢?Activity類中提供了一個startActivity()方法,這個方法是專門用於啓動活動的,它接收一個Intent參數,這裏咱們將構建好的Intent傳入startActivity()方法就能夠啓動目標活動了。修改FirstActivity中按鈕的點擊事件,代碼以下所示:typecho
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent);
咱們首先構建出了一個Intent,傳入FirstActivity.this做爲上下文,傳入SecondActivity.class做爲目標活動,這樣咱們的「意圖」就很是明顯了,即在FirstActivity這個活動的基礎上打開SecondActivity這個活動。而後經過startActivity()方法來執行這個Intent。
運行結果以下,若是想從新回到上一個活動,直接按下Back便可。也能夠像前文所說的那樣給button2添加onClick事件,使用finish()方法。
佈局
相比於顯式Intent,隱式Intent則含蓄了許多,它並不明確指出咱們想要啓動哪個活動,而是指定了一系列更爲抽象的action和category等信息,而後交由系統去分析這個Intent,並幫咱們找出合適的活動去啓動。ui
什麼是合適的活動呢?就是action和category等信息都與咱們的指定相匹配的活動。每一個活動只能指定一個action,可是能夠指定多個category。其中,android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category添加到Intent中。this
在<activity>標籤下配置<intent-filter>內容,指定SecondActivity的action和category信息。以下:
<activity android:name=".SecondActivity" > <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
修改FirstActivity中按鈕的點擊事件。
Intent intent = new Intent("com.example.activitytest.ACTION_START"); startActivity(intent);
運行程序,跳轉結果以下所示。
下面咱們使用addCategory()方法給intent添加一個category。這裏咱們指定一個自定義的category,值爲com.example.activitytest.MY_CATEGORY。在startActivity()語句前添加以下代碼:
intent.addCategory("com.example.activitytest.MY_CATEGORY");
程序運行錯誤!logcat中的錯誤信息以下:
這個錯誤表示沒有活動能夠響應咱們的Intent。
咱們在<intent-filter>中再添加一個category的聲明,就能夠解決這個問題了:
<category android:name="com.example.activitytest.MY_CATEGORY"/>
由此,能夠知道,活動中的action和category信息必須與Intent中的action和category信息徹底匹配,才能被啓動。
使用隱式Intent,咱們不只能夠啓動本身程序內的活動,還能夠啓動其餘程序的活動,這使得Android多個應用程序之間的功能共享成爲了可能。
下面嘗試啓動系統瀏覽器來打開百度首頁。咱們在SecondActivity中設置button2的點擊事件,而後在點擊事件中添加以下代碼:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent);
從新運行程序,結果以下所示:
這裏咱們首先指定了Intent的action是Intent.ACTION_VIEW,這是一個Android系統內置的動做,其常量值爲android.intent.action.VIEW。而後經過Uri.parse()方法,將一個網址字符串解析成一個Uri對象,再調用Intent的setData()方法將這個Uri對象傳遞進去。
與此對應,咱們還能夠在<intent-filter>標籤中再配置一個<data>標籤,用於更精確地指定當前活動可以響應什麼類型的數據。<data>標籤中主要能夠配置如下內容。
android:scheme 用於指定數據的協議部分,如上例中的http部分。
android:host 用於指定數據的主機名部分,如上例中的www.baidu.com部分。
android:port 用於指定數據的端口部分,通常緊隨在主機名以後。
android:path 用於指定主機名和端口以後的部分,如一段網址中跟在域名以後的內容。
android:mimeType 用於指定能夠處理的數據類型,容許使用通配符的方式進行指定。
舉個例子:
只有<data>標籤中指定的內容和Intent中攜帶的Data徹底一致時,當前活動纔可以響應該Intent。不過通常在<data>標籤中都不會指定過多的內容,如上面瀏覽器示例中,其實只須要指定android:scheme爲http,就能夠響應全部的http協議的Intent了。
下面咱們來新建一個活動,命名爲ThirdActivity,使它能響應打開網頁的Intent。和新建SecondActivity的步驟相同。最後,打開AndroidManifest.xml,在ThirdActivity的<intent-filter>中配置以下:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> </intent-filter>
在<data>標籤中咱們經過android:scheme指定了數據的協議必須是http協議。運行結果以下:
系統會自動彈出一個列表,顯示了目前可以響應這個Intent的全部程序。
除了http外,咱們還能夠指定其餘的協議。好比geo表示地理位置、tel表示電話、smsto表示發送短信、mailto發送郵件等等。咱們甚至還能夠自定義協議,下面來實踐一下:
在AndroidManifest.xml中修改ThirdActivity的data字段以下:
<data android:scheme="myscheme" />
而後修改SecondActivity中button2的點擊事件爲
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("myscheme://share")); startActivity(intent);
運行程序,在SecondActivity點擊按鈕,成功跳轉至ThirdActivity。