Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學習之Intent過濾器的使用

Android學習之Intent過濾器的使用

編輯:關於Android編程

Intent過濾器

我們的app的功能可能對別的app也有用,那麼我們的app應該做好響應其他APP的准備。

例如,一個社交app,它可以分享信息或者照片給好友,那麼最好我們的app能夠接收ACTION_SEND的intent,這樣當用戶在其他app觸發分享功能的時候,我們的app也能夠出現在待選對話框。

通過在manifest文件中的標簽下添加屬性,能使其他的app能夠啟動我們的activity。

當app被安裝到設備上時,系統可以識別intent filter並把這些信息記錄下來。

當其他app使用隱式intent執行startActivity()或者startActivityForResult()時,系統會自動查找出那些可以響應該intent的activity。

添加Intent Filter

為了盡可能確切的定義activity能夠處理的intent,每一個intent filter都應該盡可能詳盡的定義好action元素與data元素。

若activity中的intent filter滿足以下intent對象的標准,系統就能夠把特定的intent發送給activity:

Action:一個想要執行的動作的名稱。
通常是系統已經定義好的值,如ACTION_SEND或ACTION_VIEW。 在intent filter中通過指定它的值,值的類型必須為字符串,而不是API中的常量(看下面的例子)

Data:Intent附帶數據的描述。
在intent filter中通過指定它的值,可以使用一個或者多個屬性,我們可以只定義MIME type或者是只指定URI prefix,也可以只定義一個URI scheme,或者是他們綜合使用。

Note: 如果不想處理Uri類型的數據,那麼應該指定 android:mimeType 屬性。例如 text/plain or image/jpeg.

Category:提供一個附加的方法來標識這個activity能夠處理的intent。
通常與用戶的手勢或者是啟動位置有關。系統有支持幾種不同的categories,但是大多數都很少用到。而且,所有的隱式 intents都默認是 CATEGORY_DEFAULT 類型的。在intent filter中用指定它的值。

在我們APP的intent filter中,可以在元素中定義對應的XML元素來聲明我們的activity使用何種標准。

例如,這個有intent filter的activity,當數據類型為文本或圖像時會處理ACTION_SEND的intent。


    
        
        
        
        
    

又如,通過配置文件中的intent過濾器設置,activity會對外宣稱自己是適合處理ACTION_VIEW的activity。

如果是開發一款浏覽器應用,為響應ACTION_VIEW操作,需要在activity聲明中包含以下intent過濾器:


   
      
      
      
   

intent過濾器中的action元素告訴操作系統,activity能夠處理指定的任務;
DEFAULT類別告訴操作系統,activity願意處理某項任務。

DEFAULT類別必須明確地在intent過濾器中進行設置。
如果沒有在的intent filter中聲明CATEGORY_DEFAULT,activity將無法對implicit intent做出響應。

DEFAULT類別實際隱含添加到了幾乎每一個隱式intent中。(唯一的例外是LAUNCHER類別,因為他是所有應用的主activity都會響應的隱式intent,並且要帶有MAIN的action)。

每一個發出去的intent只會包含一個action與data類型,但處理這個intent的activity的 可以聲明多個, 與 。

如果任何的兩對action與data是互相矛盾的,就應該創建不同的intent filter來指定特定的action與type。

例如,假設我們的activity可以處理文本與圖片,無論是ACTION_SEND還是ACTION_SENDTO的intent。在這種情況下,就必須為兩個action定義兩個不同的intent filter。因為ACTION_SENDTO的intent 必須使用 Uri 類型來指定接收者使用 send 或 sendto 的地址。例子:

 
    
    
        
        
        
        
    
    
    
        
        
        
        
    

在Activity中處理發送過來的Intent

為了決定采用哪個action,我們可以讀取Intent的內容。

可以執行getIntent()獲取啟動我們的activity的那個intent。我們可以在activity生命周期的任何時候去執行這個方法,但最好是在onCreate()或者onStart()裡面去執行。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // 獲得啟動當前activity的intent
    Intent intent = getIntent();
    Uri data = intent.getData();

    // 計算出intent的type
    if (intent.getType().indexOf(image/) != -1) {
        // 處理intent的類型是圖像的數據 ...
    } else if (intent.getType().equals(text/plain)) {
        // 處理intent的類型是文本的數據 ...
    }
}

返回Result

如果想返回一個result給啟動我們的activity的那個activity,僅僅需要執行setResult(),通過指定一個result code與result intent。操作完成之後,用戶需要返回到原來的activity,通過執行finish() 關閉被喚起的activity。

// 創建Intent來提供某種形式的結果數據
Intent result = new Intent(com.example.RESULT_ACTION, Uri.parse(content://result_uri);
setResult(Activity.RESULT_OK, result);
finish();

我們必須總是指定一個result code。通常不是RESULT_OK就是RESULT_CANCELED。我們可以通過Intent來添加需要返回的數據。

Note:默認的result code是RESULT_CANCELED.因此,如果用戶在沒有完成操作之前點擊了返回鍵,那麼之前的activity接受到的result code就是”canceled”。

如果只是純粹想要返回一個整數來表示結果的選項之一,則可以設置result code為任何大於0的數值。

如果我們返回的result只是一個整數,那麼連intent都可以不需要返回了,可以調用setResult(int)然後只傳遞result code如下:

setResult(RESULT_COLOR_RED);
finish();

Note:我們沒有必要在意自己的activity是被用startActivity()還是 startActivityForResult()方法所叫起的。系統會自動去判斷該如何傳遞result。在不需要result的情況下,result會被自動忽略。

 

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