新聞中心
Android 意圖(Intent)和過濾器(Filter)
Android意圖是一個要執(zhí)行的操作的抽象描述。它可以通過 startActivity 來啟動一個活動,broadcastIntent 來發(fā)送廣播到任何對它感興趣的廣播接受器組件,startService(Intent) 或者bindService(Intent, ServiceConnection, int) 來與后臺服務(wù)通訊。

10多年的隆德網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整隆德建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“隆德網(wǎng)站設(shè)計”,“隆德網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
意圖本身(一個 Intent 對象)是一個被動的數(shù)據(jù)結(jié)構(gòu),保存著要執(zhí)行操作的抽象描述。
例如,你有一個活動,需要打開郵件客戶端并通過 Android 設(shè)備來發(fā)送郵件。為了這個目的,你的活動需要發(fā)送一個帶有合適選擇器的 ACTION_SEND 到 Android 意圖處理者。指定的選擇器給定合適的界面來讓用戶決定如何發(fā)送他的郵件數(shù)據(jù)。
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
email.putExtra(Intent.EXTRA_EMAIL, recipients);
email.putExtra(Intent.EXTRA_SUBJECT, subject.getText().toString());
email.putExtra(Intent.EXTRA_TEXT, body.getText().toString());
startActivity(Intent.createChooser(email, "Choose an email client from..."));上面的語法調(diào)用 startActivity 方法來開啟郵件活動,代碼運行結(jié)果看起來像這樣:
例如,你有一個活動,需要在 Android 設(shè)備上通過瀏覽器打開一個URL。為了這個目的,你的活動發(fā)送 ACTION_WEB_SEARCH 意圖到 Android 意圖處理器來在瀏覽器中打開給定的 URL 。意圖處理器通過解析一系列活動,并選擇最適合你的意圖的一個活動,在這個例子中,是 Web 瀏覽器活動。意圖處理器傳遞你的網(wǎng)頁地址到 Web 瀏覽器,并打開 Web 瀏覽器活動。
String q = "http://www.uprogrammer.cn"; Intent intent = new Intent(Intent.ACTION_WEB_SEARCH ); intent.putExtra(SearchManager.QUERY, q); startActivity(intent);
上面的例子將在Android搜索引擎上查找"www.uprogrammer.cn",并在一個活動上給出關(guān)鍵詞的結(jié)果。
對于每一個組件-活動,服務(wù),廣播接收器都有獨立的機制來傳遞意圖。
| 序號 | 方法和描述 |
|---|---|
| 1 | Context.startActivity():意圖傳遞給該方法,用于啟動一個新的活動或者讓已存在的活動做一些新的事情。 |
| 2 | Context.startService():意圖傳遞給該方法,將初始化一個服務(wù),或者新的信息到一個持續(xù)存在的服務(wù)。 |
| 3 | Context.sendBroadcast():意圖傳遞給該方法,信息將傳遞到所有對此感興趣的廣播接收器。 |
意圖對象
意圖對象是一包的信息,用于組件接收到的意圖就像 Android 系統(tǒng)接受到的信息。
意圖對象包括如下的組件,具體取決于要通信或者執(zhí)行什么。
動作(Action)
這是意圖對象中必須的部分,被表現(xiàn)為一個字符串。在廣播的意圖中,動作一旦發(fā)生,將會被報告。動作將很大程度上決定意圖的其他部分如何被組織。Intent 類定義了一系列動作常量對應(yīng)不同的意圖。這里是一份Android意圖標準動作列表。
意圖對象中的動作可以通過 setAction() 方法來設(shè)置,通過 getAction() 方法來讀取。
數(shù)據(jù)(Data)
添加數(shù)據(jù)規(guī)格到意圖過濾器。這個規(guī)格可以只是一個數(shù)據(jù)類型(如元類型屬性),一條 URI ,或者同時包括數(shù)據(jù)類型和 URI 。 URI 則由不同部分的屬性來指定。
這些指定 URL 格式的屬性是可選的,但是也相互獨立 -
- 如果意圖過濾器沒有指定模式,所有其他的 URI 屬性將被忽略。
- 如果沒有為過濾器指定主機,端口屬性和所有路徑屬性將被忽略。
setData() 方法只能以 URI 來指定數(shù)據(jù),setType() 只能以元類型指定數(shù)據(jù),setDataAndType() 可以同時指定 URI 和元類型。URI 通過 getData() 讀取,類型通過 getType() 讀取。
以下是動作/數(shù)據(jù)組的一些實例 -
| 序號 | 動作/數(shù)據(jù)組和描述 |
|---|---|
| 1 | ACTION_VIEW content://contacts/people/1:顯示ID為1的用戶的信息。 |
| 2 | ACTION_DIAL content://contacts/people/1:顯示電話撥號器,并填充用戶1的數(shù)據(jù)。 |
| 3 | ACTION_VIEW tel:123:顯示電話撥號器,并填充給定的號碼。 |
| 4 | ACTION_DIAL tel:123:顯示電話撥號器,并填充給定的號碼。 |
| 5 | ACTION_EDIT content://contacts/people/1:編輯ID為1的用戶信息。 |
| 6 | ACTION_VIEW content://contacts/people/:顯示用戶列表,以便查看。 |
| 7 | ACTION_SET_WALLPAPER:顯示選擇壁紙設(shè)置。 |
| 8 | ACTION_SYNC:同步數(shù)據(jù),默認的值為:android.intent.action.SYNC |
| 9 | ACTION_SYSTEM_TUTORIAL:開啟平臺定義的教程(默認教程或者啟動教程) |
| 10 | ACTION_TIMEZONE_CHANGED:當(dāng)時區(qū)被改變時通知 |
| 11 | ACTION_UNINSTALL_PACKAGE:運行默認的卸載器 |
類別
類別是意圖中可選的部分,是一個字符串,包含該類型組件需要處理的意圖的附加信息。addCategory() 方法為意圖對象添加類別,removeCategory() 方法刪除之前添加的類別,getCategories() 獲取所有被設(shè)置到意圖對象中的類別。這里是Android意圖標準類別列表。
可以查看下面章節(jié)中的意圖過濾器來了解我們?nèi)绾问褂妙悇e來通過對應(yīng)的意圖選擇合適的活動。
附加數(shù)據(jù)
這是傳遞給需要處理意圖的組件的以鍵值對描述的附加信息。通過 putExtras() 方法設(shè)置,getExtras() 方法讀取。這里是Android意圖標準附加數(shù)據(jù)列表。
標記
這些標記是意圖的可選部分,說明Android系統(tǒng)如何來啟動活動,啟動后如何處理等。
| 序號 | 標記和說明 |
|---|---|
| 1 | FLAG_ACTIVITY_CLEAR_TASK :如果在意圖中設(shè)置,并通過 Context.startActivity 傳遞,這個標記將導(dǎo)致與該活動相關(guān)聯(lián)的所有已存在的任務(wù)在活動啟動前被清空?;顒訉⒊蔀橐粋€空任務(wù)的根,所有舊的活動被結(jié)束。該標記可以與 FLAG_ACTIVITY_NEW_TASK 結(jié)合使用。 |
| 2 | FLAG_ACTIVITY_CLEAR_TOP :如果設(shè)置該標記,活動將在當(dāng)前運行的任務(wù)中被啟動。這并不會啟動一個新的活動實例,所有的在它之上的活動被關(guān)閉,這個意圖作為一個新的意圖被傳遞到已有的(目前在頂部的)活動。 |
| 3 | FLAG_ACTIVITY_NEW_TASK :這個標記一般用于使得活動用于"啟動器"風(fēng)格的行為:為用戶提供一個可以獨立完成運行的數(shù)據(jù),并啟動完整兒獨立的活動。 |
組件名稱
組件名稱對象是一個可選的域,代表活動、服務(wù)或者廣播接收器類。如果設(shè)置,則意圖對象被傳遞到實現(xiàn)設(shè)計好的類的實例,否則,Android 使用其他意圖中的其他信息來定位一個合適的目標。組件名稱通過 setComponent(),setClass()或者 setClassName() 來設(shè)置,通過 getComponent() 獲取。
意圖的類型
Android 支持兩種類型的意圖。
顯式意圖
顯式意圖用于連接應(yīng)用程序的內(nèi)部世界,假設(shè)你需要連接一個活動到另外一個活動,我們可以通過顯示意圖,下圖顯示通過點擊按鈕連接第一個活動到第二個活動。
這些意圖通過名稱指定目標組件,一般用于應(yīng)用程序內(nèi)部信息 - 比如一個活動啟動一個下屬活動或者啟動一個兄弟活動。舉個例子:
// 通過指定類名的顯式意圖 Intent i = new Intent(FirstActivity.this, SecondAcitivity.class); // 啟動目標活動 startActivity(i);
隱式意圖
這些意圖沒有為目標命名,組件名稱的域為空。隱式意圖經(jīng)常用于激活其他應(yīng)用程序的組件。舉個例子:
Intent read1=new Intent(); read1.setAction(android.content.Intent.ACTION_VIEW); read1.setData(ContactsContract.Contacts.CONTENT_URI); startActivity(read1);
上面的代碼將給出如下結(jié)果:
目標組件接收到意圖,可以使用getExtras()方法來獲取由源組件發(fā)送的附加數(shù)據(jù)。例如:
// 在代碼中的合適位置獲取包對象
Bundle extras = getIntent().getExtras();
// 通過鍵解壓數(shù)據(jù)
String value1 = extras.getString("Key1");
String value2 = extras.getString("Key2");
實例
下面的實例演示使用 Android 意圖來啟動各種 Android 內(nèi)置應(yīng)用程序的功能。
| 步驟 | 描述 |
|---|---|
| 1 | 使用 Android Studio IDE 創(chuàng)建 Android 應(yīng)用程序,并命名為Intent filter,包名為 cn.uprogrammer.intentfilter。當(dāng)創(chuàng)建項目時,確保目標 SDK 和用最新版本的 Android SDK 進行編譯使用高級的API。 |
| 2 | 修改src/cn.uprogrammer.intentfilter/MainActivity.java文件,并添加代碼定義兩個監(jiān)聽器來對應(yīng)兩個按鈕"啟動瀏覽器"和"啟動電話" |
| 3 | 修改res/layout/activity_main.xml布局文件,在線性布局中添加3個按鈕。 |
| 4 | 啟動Android模擬器來運行應(yīng)用程序,并驗證應(yīng)用程序所做改變的結(jié)果。 |
以下是src/cn.uprogrammer.intentfilter/MainActivity.java文件的內(nèi)容:
package cn.uprogrammer.intentfilter; import android.content.Intent; import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; public class MainActivity extends ActionBarActivity { Button b1,b2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); b1=(Button)findViewById(R.id.button); b1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.uprogrammer.cn")); startActivity(i); } }); b2=(Button)findViewById(R.id.button2); b2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("tel:9510300000")); startActivity(i); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }下面是res/layout/activity_main.xml文件的內(nèi)容:
下面是res/values/strings/xml的內(nèi)容,定義了兩個新的常量。
Intent filter Settings 下面是默認的AndroidManifest.xml的內(nèi)容:
讓我們運行剛剛修改的 Intent filter 應(yīng)用程序。我假設(shè)你已經(jīng)在安裝環(huán)境時創(chuàng)建了 AVD。打開你的項目中的活動文件,點擊工具欄中的 圖標來在 Android Studio 中運行應(yīng)用程序。Android Studio 在 AVD 上安裝應(yīng)用程序并啟動它。如果一切順利,將在模擬器窗口上顯示如下:
現(xiàn)在點擊"啟動瀏覽器"按鈕,這將根據(jù)配置啟動一個瀏覽器,并且顯示http://www.uprogrammer.cn如下:
類似的方式,你可以點擊"啟動電話"按鈕來打開電話界面,這將允許你撥打已經(jīng)給定的電話號碼。
意圖過濾器
你已經(jīng)看到如何使用意圖來調(diào)用另外的活動。 Android 操作系統(tǒng)使用過濾器來指定一系列活動、服務(wù)和廣播接收器處理意圖,需要借助于意圖所指定的動作、類別、數(shù)據(jù)模式。在 manifest 文件中使用
下面的實例展示AndroidManifest.xml文件的一部分,指定一個活動cn.uprogrammer.intentfilter.CustomActivity可以通過設(shè)置的動作,類別及數(shù)據(jù)來調(diào)用:
當(dāng)活動被上面的過濾器所定義,其他活動就可以通過下面的方式來調(diào)用這個活動。使用 android.intent.action.VIEW,使用 cn.uprogrammer.intentfilter.LAUNCH 動作,并提供android.intent.category.DEFAULT類別。
元素指定要被調(diào)用的活動所期望的數(shù)據(jù)類型。上面的實例中,自定義活動期望的數(shù)據(jù)由"http://"開頭。
有這樣的情況,通過過濾器,意圖將被傳遞到多個的活動或者服務(wù),用戶將被詢問啟動哪個組件。如果沒有找到目標組件,將發(fā)生一個異常。
在調(diào)用活動之前,有一系列的 Android 檢查測試:
- 過濾器
需要列出一個或者多個的動作,不能為空;過濾器至少包含一個 元素,否則將阻塞所有的意圖。如果多個動作被提到,Android 在調(diào)用活動前嘗試匹配其中提到的一個動作。 - 過濾器
可能列出0個,1個或者多個類別。如果沒有類別被提到,Android 通過這個測試,如果有多個類別被提及,意圖通過類型測試,每個意圖對象的分類必須匹配過濾器中的一個分類。 - 每個 元素可以指定一個 URI 和一個數(shù)據(jù)類型(元媒體類型)。這里有獨立的屬性,如 URI 中的每個部分:模式,主機,端口和路徑。意圖包含有 URI 和類型,只有它的類型匹配了過濾器中列出的某個類型,則通過數(shù)據(jù)類型部分的測試。
實例
下面的實例是上面實例的一些修改。這里我們將看到如果一個意圖調(diào)用定義的兩個活動,Android 如何來解決沖突;如何使用過濾器來調(diào)用自定義活動;如果沒有為意圖定義合適的活動,則會出現(xiàn)異常。
| 步驟 | 說明 |
|---|---|
| 1 | 使用Android Studio IDE創(chuàng)建Android應(yīng)用程序,并命名為Intent filter,包名為cn.uprogrammer.intentfilter。當(dāng)創(chuàng)建項目時,確保目標 SDK 和用最新版本的 Android SDK 進行編譯使用高級的API。 |
| 2 | 修改 src/cn.uprogrammer.intentfilter/MainActivity.java 文件,添加代碼來定義三個監(jiān)聽器來對應(yīng)布局文件中定義的三個按鈕。 |
| 3 | 添加 src/cn.uprogrammer.intentfilter/CustomActivity.java 文件來包含一個活動,可以被不同的意圖調(diào)用。 |
| 4 | 修改 res/layout/activity_main.xml 文件在線性布局中添加三個按鈕。 |
| 5 | 添加 res/lauout/custom_view.xml 布局文件,添加簡單地 來顯示通過 intent 傳遞的數(shù)據(jù)。 |
| 6 | 修改 AndroidManifest.xml 文件,添加 |
| 7 | 啟動 Android 模擬器來運行應(yīng)用程序,并驗證應(yīng)用程序所做改變的結(jié)果。 |
以下是src/cn.uprogrammer.intentfilter/MainActivity.java的內(nèi)容:
package cn.uprogrammer.intentfilter;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
Button b1,b2,b3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://www.uprogrammer.cn"));
startActivity(i);
}
});
b2=(Button)findViewById(R.id.button2);
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("cn.uprogrammer.intentfilter.LAUNCH",Uri.parse("http://www.uprogrammer.cn"));
startActivity(i);
}
});
b3=(Button)findViewById(R.id.button3);
b3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent("cn.uprogrammer.intentfilter.LAUNCH",Uri.parse("https://www.uprogrammer.cn"));
startActivity(i);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}下面是src/cn.uprogrammer.intentfilter/CustomActivity.java的內(nèi)容:
package cn.uprogrammer.intentfilter;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_view);
TextView label = (TextView) findViewById(R.id.show_data);
Uri url = getIntent().getData();
label.setText(url.toString());
}
}下面是res/layout/activity_main.xml 的內(nèi)容:
下面是res/layout/custom_view.xml文件的內(nèi)容:
下面是res/values/strings.xml文件的內(nèi)容:
My Application Settings
下面是AndroidManifest.xml文件的內(nèi)容:
讓我們運行剛剛修改的 Intent filter 應(yīng)用程序。我假設(shè)你已經(jīng)在安裝環(huán)境時創(chuàng)建了 AVD 。打開你的項目中的活動文件,點擊工具欄中的圖標來在 Android Studio 中運行應(yīng)用程序。 Android Studio 在 AVD 上安裝應(yīng)用程序并啟動它。如果一切順利,將在模擬器窗口上顯示如下:
點擊第一個按鈕"使用View動作啟動瀏覽器"。這里我們定義我們自定義的活動包含"android.intent.action.VIEW",并且 Android 系統(tǒng)已經(jīng)定義了默認的活動來對應(yīng)VIEW動作來啟動Web瀏覽器,因此 Android 顯示下面的選項來選擇你想要啟動的活動:
如果你選擇瀏覽器, Android 將啟動 Web 瀏覽器,并打開 www.uprogrammer.cn 網(wǎng)站。如果你選擇 IntentDemo選項,Android 將啟動 CustomActivity,該活動什么都沒有做,僅僅是捕獲并在TextView中顯示傳遞的數(shù)據(jù)。
現(xiàn)在,通過返回按鈕返回并點擊"通過Launch動作啟動瀏覽器"按鈕,這里 Android 應(yīng)用過濾器來選擇定義的活動,并簡單啟動自定義活動。
再次使用返回按鈕返回,并點擊"異常條件"按鈕,這里Android嘗試找到一個由意圖給定的有效的過濾器,但沒有找到一個定義的有效的活動。因為我們使用 https 代替 http 的數(shù)據(jù),并給定了正確的動作,一次 Android 產(chǎn)生了一個異常。如下:
網(wǎng)站標題:創(chuàng)新互聯(lián)Android教程:Android教程
網(wǎng)頁地址:http://m.fisionsoft.com.cn/article/ccisdeg.html


咨詢
建站咨詢
