隱式啟動(dòng)Activity時(shí),Android系統(tǒng)在應(yīng)用程序運(yùn)行時(shí)解析Intent,并根據(jù)一定的規(guī)則對(duì)Intent和Activity進(jìn)行匹配,使Intent上的動(dòng)作、數(shù)據(jù)與Activity完全吻合。而匹配的Activity可以是應(yīng)用程序本身的,也可以是Android系統(tǒng)內(nèi)置的,還可以是第三方應(yīng)用程序提供的。因此,這種方式更強(qiáng)調(diào)了Android應(yīng)用程序中組件的可復(fù)用性。
由此可以看出,隱式啟動(dòng)不需要指明需要啟動(dòng)哪一個(gè)Activity,而由Android系統(tǒng)來(lái)決定,有利于使用第三方組件。
在默認(rèn)情況下,Android系統(tǒng)會(huì)調(diào)用內(nèi)置的Web瀏覽器,代碼如代碼清單6-5所示。
代碼清單6-5 隱式啟動(dòng)默認(rèn)情況調(diào)用內(nèi)置Web瀏覽器
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(intent);
在上述代碼中,Intent的動(dòng)作是Intent.ACTION_VIEW,是根據(jù)Uri的數(shù)據(jù)類(lèi)型來(lái)匹配動(dòng)作;數(shù)據(jù)部分的Uri是Web地址,使用Uri.parse(urlString)方法,可以簡(jiǎn)單地把一個(gè)字符串解釋成Uri對(duì)象。
Intent的語(yǔ)法如代碼清單6-6所示。
代碼清單6-6 Intent語(yǔ)法
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlString));
Intent構(gòu)造函數(shù)的第1個(gè)參數(shù)是Intent需要執(zhí)行的動(dòng)作;第2個(gè)參數(shù)是Uri,表示需要傳遞的數(shù)據(jù)。
Android系統(tǒng)支持的常見(jiàn)動(dòng)作字符串常量表,如表6-3所示。
表6-3 Android系統(tǒng)支持的常見(jiàn)動(dòng)作字符串常量表
動(dòng) 作 |
說(shuō) 明 |
ACTION_ANSWER |
打開(kāi)接聽(tīng)電話的Activity,默認(rèn)為Android內(nèi)置的撥號(hào)盤(pán)界面 |
ACTION_CALL |
打開(kāi)撥號(hào)盤(pán)界面并撥打電話,使用Uri中的數(shù)字部分作為電話號(hào)碼 |
ACTION_DELETE |
打開(kāi)一個(gè)Activity,對(duì)所提供的數(shù)據(jù)進(jìn)行刪除操作 |
ACTION_DIAL |
打開(kāi)內(nèi)置撥號(hào)盤(pán)界面,顯示Uri中提供的電話號(hào)碼 |
ACTION_EDIT |
打開(kāi)一個(gè)Activity,對(duì)所提供的數(shù)據(jù)進(jìn)行編輯操作 |
ACTION_INSERT |
打開(kāi)一個(gè)Activity,在提供數(shù)據(jù)的當(dāng)前位置插入新項(xiàng) |
ACTION_PICK |
啟動(dòng)一個(gè)子Activity,從提供的數(shù)據(jù)列表中選取一項(xiàng) |
ACTION_SEARCH |
啟動(dòng)一個(gè)Activity,執(zhí)行搜索動(dòng)作 |
ACTION_SENDTO |
啟動(dòng)一個(gè)Activity,向數(shù)據(jù)提供的聯(lián)系人發(fā)送信息 |
ACTION_SEND |
啟動(dòng)一個(gè)可以發(fā)送數(shù)據(jù)的Activity |
ACTION_VIEW |
常用的動(dòng)作,對(duì)以Uri方式傳送的數(shù)據(jù),根據(jù)Uri協(xié)議部分以佳方式啟動(dòng)相應(yīng)的Activity進(jìn)行處理。對(duì)于http:address將打開(kāi)瀏覽器查看;對(duì)于tel:address將打開(kāi)撥號(hào)呼叫指定的電話號(hào)碼 |
ACTION_WEB_SEARCH |
打開(kāi)一個(gè)Activity,對(duì)提供的數(shù)據(jù)進(jìn)行Web搜索 |
以下將通過(guò)一個(gè)WebViewIntentDemo示例來(lái)了解如何隱式啟動(dòng)Activity。
如圖6-3所示,當(dāng)用戶(hù)在文本框中輸入要訪問(wèn)的網(wǎng)址后,通過(guò)單擊“Go”按鈕,程序根據(jù)用戶(hù)輸入的網(wǎng)址生成一個(gè)Intent,并以隱式啟動(dòng)的方式調(diào)用Android內(nèi)置的Web瀏覽器,并打開(kāi)指定的Web頁(yè)面。本例輸入的網(wǎng)址是google主頁(yè)的主站地址,地址是://www.google.com。

圖6-3 隱式啟動(dòng)Activity
其中,main.xml代碼如代碼清單6-7所示。
代碼清單6-7 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText
android:id="@+id/url_field"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:lines="1"
android:inputType="textUri"
android:imeOptions="actionGo" />
<Button
android:id="@+id/go_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go_button" />
</LinearLayout>
其中,strings.xml代碼如代碼清單6-8所示。
代碼清單6-8 strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name"> WebViewIntentDemo </string>
<string name="go_button">Go</string>
</resources>
WebViewIntentDemo.java代碼如代碼清單6-9所示。
代碼清單6-9 WebViewIntentDemo.java
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.widget.Button;
import android.widget.EditText;
public class WebViewIntentDemo extends Activity {
private EditText urlText;
private Button goButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get a handle to all user interface elements
urlText = (EditText) findViewById(R.id.url_field);
goButton = (Button) findViewById(R.id.go_button);
// Setup event handlers
goButton.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
openBrowser();
}
});
urlText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
openBrowser();
return true;
}
return false;
}
});
}
}
在上述代碼中第26行對(duì)按鈕“Go”添加監(jiān)聽(tīng),當(dāng)觸摸單擊或通過(guò)手機(jī)按鍵單擊該按鈕時(shí),觸發(fā)openBrowser()方法。其中,openBrowser()方法代碼如代碼清單6-10所示。
代碼清單6-10 openBrowser()方法
/** Open a browser on the URL specified in the text box */
private void openBrowser() {
Uri uri = Uri.parse(urlText.getText().toString());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}