Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的Intent和Intent-filter總結

Android中的Intent和Intent-filter總結

編輯:關於Android編程

一.相關概念

(一)基本概念

Intent中文意思指”意圖”,按照Android的設計理念,Android使用Intent來封裝程序的”調用意圖”,不管啟動Activity、Service、BroadcastReceiver,Android都使用統一的Intent對象來封裝這一”啟動意圖”。此外,Intent也是應用程序組件之間通信的重要媒介。在Android中指定的了具體是某個組件,那麼就是顯性意圖;如果只是提出要求沒有指定具體的某個人,在Android中即沒有指定某個具體的組件,那麼就是隱式意圖;所有Intent頁面跳轉的方式又分為顯示跳轉和隱式跳轉。
 

(二)Intent和三大組件 

Android應用程序包含三種重要組件:Activity、Service、BroadcastReceiver,應用程序采用一致的方式啟動它們,都是依靠Intent來進行啟動的,Intent中封裝了程序要啟動的意圖。

  下面是Intent啟動不同組件的部分方法:
 Activity組件:
 startActivity(Intent intent);startActivityForResult(Intent intent,int requestCode);
 Service組件:
 startService(Intent intent);bindService(Intent intent,ServiceConnection conn,int flags);
 BroadcastReceiver組件:
 sendBroadcast(Intent intent);sendOrderedBroadcast(Intent intent,String receiverPermission);
  

(三)Intent的屬性類別

Intent的屬性及intent-filter的配置相結合使用;Intent的屬性大致包含:Component,Action,Category,Data,Type,Extra,Flag這7種屬性,其中Component用於明確指定需要啟動的組件,而Extra則用於”攜帶”需要交換的數據。
關於Intent屬性的詳解,在簡單使用後再介紹。

二.Intent的使用

這裡的Intent使用,主要是使用它來執行頁面的跳轉功能。
如果Intent對象中包含了目標的class文件,那麼就是顯示意圖的跳轉;如果Intent沒有包含目標的class文件,就是隱式意圖跳轉,隱式意圖跳轉就涉及到比較多的Intent對象的屬性值的比較。

(一)Intent顯式跳轉頁面

其中實現跳轉的java代碼非常簡單:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

其中具體實現是通過Intent的屬性類Component來實現,不過Component類的方法都封裝在Intent的方法裡面了,不需要我們過多的去了解。
這如果要傳遞數據也可以通過Intent對象使用putExtra方法來傳遞數據。
這裡的目標文件必須是要在AndroidManifest.xml裡面注冊。

(二)Intent隱式跳轉頁面

隱式意圖的跳轉是本文主要講解的內容,也是比較難理解的內容!
這裡先使用Intent的Action和Data屬性來跳轉頁面做示例(特別要注意的是這裡的Data不是Intent的數據,而是Action動作對應的數據):

1.布局文件activity.xml文件設計




    
上面的xml布局文件設計有5個按鈕,具體功能開java代碼,下面詳細解釋。

2.java文件MainActivity.xml文件的設計

package com.example.intent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //打開一個數據視圖,但是沒有要求,系統會默認讓你從多個中選擇其中一個打開
    public void action(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        startActivity(intent);
    }

    //打開一個數據視圖,有數據要求,系統幫你打開一個浏覽器,並連接到相關的頁面
    public void actionUri(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.baidu.com"));
        startActivity(intent);
    }

    //使用顯示跳轉的方法跳轉到第二個頁面
    public void ToSecondActivity(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }

    //這裡只用自己定義的Action字符串來找到對應的頁面
    public void MyAction(View v) {
        Intent intent = new Intent("HelloWorld");//Action字符串可以直接放在Intent的構造函數裡面,也可以單獨寫
        // intent.setAction("HelloWorld");
        intent.addCategory("android.intent.category.DEFAULT");//可以沒有
        //但是自定義的Action的xml文件裡面必須要有category元素,否則會報錯
        startActivity(intent);
    }

    //打開程序入口,特征是桌面
    public void actionMain(View v) {
        try {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            startActivity(intent);
        } catch (Exception e) {
            Toast.makeText(this, "找不到目標頁面", Toast.LENGTH_SHORT).show();
        }

    }



}

這要重點理解的代碼,下面會詳細介紹。

3.java文件SecondActivity.java文件的設計

K
一個簡單Activity的設計,使用代碼設計一個線程布局並添加兩個文本,第二個文本添加的是跳轉後顯示的Intent屬性。

4.在AndroidManifest注冊一下SecondActivity.class文件


    
        
        
    

文件中使用intent-filter(意圖過濾器),用來存放意圖的屬性

其中MainActivity.java文件是要重點理解的;上面寫了五個按鈕對應的監聽方法。
運行程序後顯示的界面:
filter0
頁面顯示有五個按鈕,每個按鈕對應的是一個按鈕的監聽方法。下面分別介紹:
第一個按鈕使用的是隱式意圖跳轉頁面,Action屬性是系統的Action對象值,是指跳轉到一個View的視圖,這沒有指向具體目標。
點擊這個按鈕會顯示多個View的視圖供你選擇,效果如圖:
filter1

可以點擊對應的視圖按鈕,進入相關界面。
其中這裡的Action值是通過構造方法來傳進去的,也可以通過Intent對象進行設置。


第二個按鈕也是打開一個視圖,但是這個視圖有動作對應的數據,所以它會直接打開一個浏覽器,來顯示你要打開的網頁。
效果如圖:
filter2

對於常用的一些頁面跳轉的Action和它對應的Date是需要我們程序員花時間去記一下的。後面會有常用的Action和Data介紹。


第三個按鈕是顯示跳轉到另一個頁面,因為這個頁面是自定義的,所以需要在注冊表AndroidManifest裡面中注冊。如果被顯式調用,只需要添加Activity的name屬性就可以了,不需要設置Activity的過濾器intent-filter也可以。
點擊按鈕後顯示的結果:
filter3
這裡的Action對象的值和Category對象的值都是空的。因為前面的跳轉的Intent對象沒有這個值,所以它的對象是空的,對比下面一個按鈕就知道了。


第四個按鈕是隱式意圖跳轉去另一個頁面,使用的Action值也不是系統定義的,而是自己定義的一個字符串。這裡是通過Action和Category的值來確定一個頁面。Category代表的是動作的類別的意思。
點擊按鈕後顯示的結果:
filter4
可以考到頁面顯示了,Intent裡面包含的Action的值和Category的值。如果之前沒有傳進去就不會有。


第五個按鈕,也是隱式意圖跳轉的使用,這裡的Action值和Category值都是系統定義的都具有特定的含義,兩個結合使用就相對於使用了Home鍵直接顯示到桌面。
還有就是這個按鈕的方法裡面使用到了try catch方法,這是防止程序崩潰的方法,正確情況如果輸入的Action值或CategZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcnnWtcO709DWuM/yxLPSu7j2u/LSu9Cp0rPD5qOsz7XNs7vh1rG907HAwKOjrMv509DKudPDdHJ5IGNhdGNoysfKrrfWsdjSqrXEoaM8YnIgLz4NCtLizbzM+NeqyrHKudPDdHJ5IGNhdGNowLS3wNa5s/a07crHt8ezo7HY0qq1xKGjPC9jb2RlPjwvcD4NCjxoMSBpZD0="三intent-filter詳細屬性的介紹">三.intent-filter詳細屬性的介紹

是每一個Activity對應的過濾器標簽節點。每一個過濾器裡面的元素可以有:
0個或多個
0個或多個
0個或1個

(一)全部屬性的簡介

Intent通過下面的屬性來描述的某個意圖:

1. action(動作): 用來表示意圖的動作,如:查看,發郵件,打電話

2. category(類別): 用來表示動作的類別。

3. data(數據): 表示與動作要操作的數據。如:查看指定的聯系人

4. type(數據類型): 對data類型的描述。

5. extras(附件信息): 附件信息。如:詳細資料,一個文件,某事。

6. component(目標組件): 目標組件。

下面詳細介紹各個組件的使用

(一)component屬性

指定了component屬性的Intent(調用setComponent(ComponentName)或者
setClass(Context, Class),Class其實就是顯式調用需要的目標類的文件名。這個屬性用得比較少,最好不用。如果是顯示調用直接指定目標類的class文件名就可以使用了。
比如:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

Intent在後台已經幫我們實現了component屬性的設置,我們不需要很麻煩的再去實現它的過程。

(二)action動作屬性

動作很大程序上決定了Intent如何構建,特別是數據和附加信息,就像一個方法名決定了參數和返回值一樣,所以應該盡可能明確地指定動作,並緊密關聯到其他的Intent字段,如Category和Data。

常用動作
最常用的是Action_MAIN(作為初始的Activity啟動,沒有數據的輸入輸出)
1. ACTION_MAIN 作為一個主要的進入口,而並不期望去接受數據
2. ACTION_VIEW 向用戶去顯示數據
3. ACTION_ATTACH_DATA 別用於指定一些數據應該附屬於一些其他的地方,例如,圖片數據應該附
屬於聯系人
4. ACTION_EDIT 訪問已給的數據,提供明確的可編輯
5. ACTION_GET_CONTENT 允許用戶選擇特殊種類的數據,並返回(特殊種類的數據:照一張相片或
錄一段音) ACTION_DIAL 撥打一個指定的號碼,顯示一個帶有號碼的用戶界面,允許
用戶去啟動呼叫
6. ACTION_CALL 根據指定的數據執行一次呼叫(有缺陷,使用ACTION_DIAL)
7. ACTION_SEND 傳遞數據,被傳送的數據沒有指定,接收的action請求用戶發數據
8. ACTION_SENDTO 發送一條信息到指定的某人
9. ACTION_ANSWER 處理一個打進電話呼叫
10. ACTION_INSERT 插入一條空項目到已給的容器
11. ACTION_DELETE 從容器中刪除已給的數據
12. ACTION_SEARCH 執行一次搜索
13. ACTION_WEB_SEARCH 執行一次web搜索
上面的動作都是Intent對象引用才有實際意義的。
setAction(String action) 用來設置Intent的動作,參數可以為常量
getAction() 方法用來獲取Intent動作名稱
上面的Action都是系統定義好的,具有一定意義的動作指向的動作。
Intent的Action對象其實就是一個字符串常量,系統的Action對象是系統定義好的字符串常量,我們也可以自己定義自己的Action作為字符串常量。就像上面的例子使用到了自定義的Action字符串對象。

(三)category類別屬性

Intent的action、category屬性都是普通的字符串,其中action表示Intent需要完成的一個抽象”動作”,而category則為action添加額外的類別信息,通常action和category一塊使用。
需要指出的是,一個Intent中只能包含一個action屬性,但可以包含多個category屬性。當程序創建Intent時,該Intent默認啟動常量值為andorid.intent.category.DEFAULT的組件。這裡的一個Intent中只能包含一個action屬性,並不是Activity中xml的設置規范,而是你要跳轉到的頁面去,你只能設置一個Action的值。
常用的Category:
 1.CATEGORY_DEFAULT:Android系統中默認的執行方式,按照普通Activity的執行方式執行。 
 2.CATEGORY_HOME:設置該組件為Home Activity。
 3.CATEGORY_PREFERENCE:設置該組件為Preference。 
 4.CATEGORY_LAUNCHER:設置為當前應用程序優先級最高的Activity,通常與ACTION_MAIN配合使用。 
 5.CATEGORY_BROWSABLE:設置該組件可以使用浏覽器啟動。 
 6.CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。
上面的類別都是Intent對象引用才有實際意義的。

(四)data動作數據

Data數據用來向Action屬性提供動作的數據。這裡的Data不是Intent裡面的數據,而是指明動作的具體數據,比如說動作是打電話,那麼打給具體的某一個人,就用到了date裡面的數據來指定。同樣發郵件、或打開具體的某一個網址也是通過Data數據。
Data屬性只接受Uri對象,Uri對象是統一資源標識符。對應概念不用太多理解,只需知道裡面某些具體值的表現形式就可以了。
Uri其實就是相當於一個網址,如圖所示:

網址只是Uri其中一種格式的字符串,要使用它還要把它解析後轉化為Uri類型。
為Intent對象添加Data數據,代碼:
intent.setData(Uri.parse(“http://www.baidu.com“));
這裡的Uri的有兩個沒顯示的屬性:port的值是8080,path的值是/index
通過下面三句代碼就可以跳轉到百度主頁面:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

(五)type數據類型

與Data有關的,這個不是Intent的數據類型,是Intent的Action的Data數據的類型。
比如:
{“.mp3”, “audio/x-mpeg”},
{“.mp4”, “video/mp4”},
{“.gif”, “image/gif”},
{“.rmvb”, “audio/x-pn-realaudio”},
這裡只是做幾個簡單的示例介紹,如果是打開gif格式的數據文件,設置type=“image/gif”

(六)extras額外的數據信息

Extras屬性主要用於傳遞目標組件所需要的額外的數據。這個數據是可以通過Intent來保存的數據和Intent對象來獲取數據。

通過putExtras()方法設置。保存數據

通過putExtras()方法設置。獲取數據

通常我們使用Intent來直接傳遞Bundle對象,但也可以傳遞其他系統內置的一些參數。
如果要傳遞是是對象,那麼對象必須實現序列化。

(七)intent-filter在AndroidManifest中

1.在裡可以有多個
,只需匹配其中一個即可。
語法:



也可以分開寫,如:

     
 等同於這樣寫:
 
 
 
等同於Uri uri = Uri.parse("something://project.example.com:80");

Uri的格式:scheme://host:port/path or pathPrefix or pathPattern
如果scheme沒有指定,那其它的屬性均無效;
如果host沒有指定,那麼port,path,pathPrefix,pathPattern均無效;
如果在manifest裡這樣寫:
那麼Uri uri = Uri.parse(“something://project.example.com”); 才可以匹配

2.在裡可以有多個data或action ,只需匹配其中一個即可。
3.當匹配不上任何Activity的話,會發生異常,跳出對話框:很抱歉…某某應用程序意外停止,請重試。
4.上面所說的全部適用於Service和BroadcastReceiver。

(八)幾個簡單示例的代碼

/**
 * 跳轉到指定的網址頁面
 */
public void toView(View v) {
    Intent intent = new Intent();
    //設置Data數據
    intent.setData(Uri.parse("http://www.baidu.com"));
    //設置Action數據
    intent.setAction(Intent.ACTION_VIEW);
    //頁面跳轉
    startActivity(intent);
}

/**
 * 跳轉到編輯聯系人的信息
 * 這裡聯系人的姓名是:1
 */
public void toEdit(View v) {
    Intent intent = new Intent();
    //設置Data數據
    intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
    //設置Action數據
    intent.setAction(Intent.ACTION_EDIT);
    //頁面跳轉
    try {
        startActivity(intent);
    } catch (Exception e) {
        Toast.makeText(this, "找不到該聯系人!", Toast.LENGTH_SHORT).show();
    }
}

/**
 * 跳轉到撥打電話的頁面
 * Data可以設置電話號碼
 */
public void toDial(View v) {
    Intent intent = new Intent();
    //設置Data數據
    intent.setData(Uri.parse("tel:13814236512"));
    //設置Action數據
    intent.setAction(Intent.ACTION_DIAL);
    //頁面跳轉
    startActivity(intent);
}

三.下面是一些Intent對象的常量值

附部分Intent屬性值:

  Action:
    ACTION_MAIN:Android Application的入口,每個Android應用必須且只能包含一個此類型的Action聲明。 
    ACTION_VIEW:系統根據不同的Data類型,通過已注冊的對應Application顯示數據。
    ACTION_EDIT:系統根據不同的Data類型,通過已注冊的對應Application編輯示數據。 
    ACTION_DIAL:系統默打開撥號程序,如果Data中設置電話號碼,則撥號框中會顯示此號碼。 
    ACTION_CALL:直接呼叫Data中所帶的號碼。 
    ACTION_ANSWER:接聽來電。 
    ACTION_SEND:由用戶指定發送方式進行數據發送操作。
    ACTION_SENDTO:系統根據不同的Data類型,通過已注冊的對應Application進行數據發送操作。 
    ACTION_BOOT_COMPLETED:Android系統在啟動完畢後發出帶有此Action的廣播(Broadcast)。 
    ACTION_TIME_CHANGED:Android系統的時間發生改變後發出帶有此Action的廣播(Broadcast)。 
    ACTION_PACKAGE_ADDED:Android系統安裝了新的App之後發出帶有此Action的廣播(Broadcast)。 
    ACTION_PACKAGE_CHANGED:Android系統中已存在的App發生改變之後(如更新)發出帶有此Action的廣播(Broadcast)。 
    ACTION_PACKAGE_REMOVED:Android系統卸載App之後發出帶有此Action的廣播(Broadcast)。  

  Category:
    CATEGORY_DEFAULT:Android系統中默認的執行方式,按照普通Activity的執行方式執行。 
    CATEGORY_HOME:設置該組件為Home Activity。
    CATEGORY_PREFERENCE:設置該組件為Preference。 
    CATEGORY_LAUNCHER:設置為當前應用程序優先級最高的Activity,通常與ACTION_MAIN配合使用。 
    CATEGORY_BROWSABLE:設置該組件可以使用浏覽器啟動。 
    CATEGORY_GADGET:設置該組件可以內嵌到另外的Activity中。

  Extras:
    EXTRA_BCC:存放郵件密送人地址的字符串數組。 
    EXTRA_CC:存放郵件抄送人地址的字符串數組。
    EXTRA_EMAIL:存放郵件地址的字符串數組。 
    EXTRA_SUBJECT:存放郵件主題字符串。 
    EXTRA_TEXT:存放郵件內容。 
    EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent的按鍵。  
    EXTRA_PHONE_NUMBER:存放調用ACTION_CALL時的電話號碼。 
  
  Data:
    tel://:號碼數據格式,後跟電話號碼。 
    mailto://:郵件數據格式,後跟郵件收件人地址。
    smsto://:短息數據格式,後跟短信接收號碼。
    content://:內容數據格式,後跟需要讀取的內容。 
    file://:文件數據格式,後跟文件路徑。
    market://search?q=pname:pkgname:市場數據格式,在Google Market裡搜索包名為pkgname的應用。
    geo://latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。
MimeType:
{“.3gp”, “video/3gpp”},
{“.apk”, “application/vnd.android.package-archive”},
{“.asf”, “video/x-ms-asf”},
{“.avi”, “video/x-msvideo”},
{“.bin”, “application/octet-stream”},
{“.bmp”, “image/bmp”},
{“.c”, “text/plain”},
{“.class”, “application/octet-stream”},
{“.conf”, “text/plain”},
{“.cpp”, “text/plain”},
{“.doc”, “application/msword”},
{“.docx”, “application/vnd.openxmlformats-officedocument.wordprocessingml.document”},
{“.xls”, “application/vnd.ms-excel”},
{“.xlsx”, “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”},
{“.exe”, “application/octet-stream”},
{“.gif”, “image/gif”},
{“.gtar”, “application/x-gtar”},
{“.gz”, “application/x-gzip”},
{“.h”, “text/plain”},
{“.htm”, “text/html”},
{“.html”, “text/html”},
{“.jar”, “application/Java-archive”},
{“.java”, “text/plain”},
{“.jpeg”, “image/jpeg”},
{“.jpg”, “image/jpeg”},
{“.js”, “application/x-JavaScript”},
{“.log”, “text/plain”},
{“.m3u”, “audio/x-mpegurl”},
{“.m4a”, “audio/mp4a-latm”},
{“.m4b”, “audio/mp4a-latm”},
{“.m4p”, “audio/mp4a-latm”},
{“.m4u”, “video/vnd.mpegurl”},
{“.m4v”, “video/x-m4v”},
{“.mov”, “video/quicktime”},
{“.mp2”, “audio/x-mpeg”},
{“.mp3”, “audio/x-mpeg”},
{“.mp4”, “video/mp4”},
{“.mpc”, “application/vnd.mpohun.certificate”},
{“.mpe”, “video/mpeg”},
{“.mpeg”, “video/mpeg”},
{“.mpg”, “video/mpeg”},
{“.mpg4”, “video/mp4”},
{“.mpga”, “audio/mpeg”},
{“.msg”, “application/vnd.ms-outlook”},
{“.ogg”, “audio/ogg”},
{“.pdf”, “application/pdf”},
{“.png”, “image/png”},
{“.pps”, “application/vnd.ms-powerpoint”},
{“.ppt”, “application/vnd.ms-powerpoint”},
{“.pptx”, “application/vnd.openxmlformats-officedocument.presentationml.presentation”},
{“.prop”, “text/plain”},
{“.rc”, “text/plain”},
{“.rmvb”, “audio/x-pn-realaudio”},
{“.rtf”, “application/rtf”},
{“.sh”, “text/plain”},
{“.tar”, “application/x-tar”},
{“.tgz”, “application/x-compressed”},
{“.txt”, “text/plain”},
{“.wav”, “audio/x-wav”},
{“.wma”, “audio/x-ms-wma”},
{“.wmv”, “audio/x-ms-wmv”},
{“.wps”, “application/vnd.ms-works”},
{“.xml”, “text/plain”},
{“.z”, “application/x-compress”},
{“.zip”, “application/x-zip-compressed”},

總結:

本文只要是對Intent知識中隱式Intent意圖的講解,其實這部分內容並不是很常用,也是比較難理解一些。

學習Intent只要學會下面幾個知識點就差不多了:
1.Intent顯式頁面跳轉的實現
2.Intent跳轉到撥打電話頁面,固定網頁上等基礎功能。
3.Intent學會使用數據的傳入和拿出。

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved