Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android---允許其他應用程序啟動你的Activity

Android---允許其他應用程序啟動你的Activity

編輯:關於Android編程

前面的兩課一直關注了故事的一邊:從你的應用程序中啟動另一個應用程序的Activity。但是如果你的應用能夠執行一個可能對另外的應用程序有用的操作,那麼你的應用程序就應該准備響應來自其他應用程序的操作請求。例如,如果你創建了一個能夠跟用戶的朋友共享消息和照片的社區應用,那麼你就應該支持ACTION_SEND類型的Intent,以便用戶能夠啟動來自其他應用程序的共享操作,並加載你的應用程序來執行這個操作。

要允許其他的應用程序來啟動你的Activity,你需要在你的清單文件的相應的<activity>元素中添加一個<intent-filter>元素。

當你的應用程序被安裝到設備上時,系統會識別你的Intent過濾器,並把這個信息添加到一個由所有被安裝應用程序所支持的內部的Intent目錄中。當一個應用程序用隱含的Intent對象來調用startActivity()或startActivityForResult()方法時,系統就會在這個目錄中查找那些Activity能夠響應這個Intent的請求。

添加Intent過濾器

為了能夠正確的定義你的Activity所能處理的Intent對象,Activity接收的操作和數據應該盡可能在每個被添加的Intent過濾器中進行具體的定義。

如果Activity有一個跟下列Intent對象條件完全匹配的Intent過濾器,系統就會把給定的Intent對象發送給這個Activity:

Action

   定義要執行的操作名稱(字符串)。通常是由平台定義的一個值,如ACTION_SEND或ACTION_VIEW。

   使用過濾器中的<action>元素來指定操作。在這個元素中指定的值必須是該操作完整的字符串名稱,而不是API常量。

Data

   定義跟該Intent匹配的數據

   使用過濾器中的<data>元素來指定數據。使用這個元素中的一個或多個屬性,你能夠只簡單指定MIME類型、URI前綴、URI方案,或者是這些的組合,以及其他的能夠接收的數據類型的指示。

   注意:如果你不需要聲明指定相關數據的Uri(如當你的Activity要處理其他類型的附加數據時,而不是URI),那麼就應該只指定android:mimeType屬性來聲明你的Activity所能處理的數據類型,如text/plain或image/jpeg。

Category

   提供兩外一種Activity處理Intent對象的方法,通常與用戶的手勢或其他的位置有關。系統支持幾種不同的分類,但是很少被使用。但是默認情況下,所有的隱含的Intent對象都要使用CATEGORY_DEFAULT來定義。

   在Intent過濾器中使用<category>元素來指定這個分類信息。

在你的Intent過濾器中,你可以在<intent-filter>元素中嵌套上述對應XML元素來聲明你的Activity所能接收的Intent對象的條件。

例如,以下Activity的Intent過濾器的聲明,能夠處理ACTION_SEND類型的Intent對象,並且數據類型可以是文本或圖片:

<activityandroid:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

每個輸入的Intent對象只能指定一個操作和一種數據類型,但是在每個<intent-filter>元素中則可以聲明多個<action>、<category>、<data>元素的實例。

如果任何兩個操作和數據的行為是相互排斥的,那麼你應該給它們建立獨立的Intent過濾器,並在每個Intent過濾器中指定其可接收的操作和對應的數據類型。

例如,假設你的Activity可以使用ACTION_SEND和ACTION_SENDTO類型的Intent來處理文本和圖片。這種情況下,你就必須給這兩個操作分別定義獨立的Intent過濾器,因為ACTION_SENDTO類型的Intent對象必須使用數據的Uri來指定收件人的地址,例如:

<activityandroid:name="ShareActivity">
    <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

注意:為了接收隱式的Intent對象,在Intent過濾器中必須包含CATEGORY_DEFAULT分類。如果包含了CATEGORY_DEFAULT分類,startActivity()和startActivityForResult()方法啟動的所有的Intent對象就會被處理,否則,隱式的Intent對象就不會被你的Activity所接收。

在你的Activity中處理Intent對象

為了決定在你的Activity中要執行的操作,你可以讀取啟動該Activity的Intent對象。

在Activity啟動時,調用getIntent()方法來獲取啟動該Activity的Intent對象。在Activity的生命周期內你可以在任何時間來做這件事,但是通常應該在早期的回到方法中(如onCreate()或onStart())來做這件事。

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    setContentView(R.layout.main);
 
    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();
 
    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
    } else if (intent.getType().equals("text/plain")) {
        // Handle intents with text ...
    }
}

返回結果

如果你想要把結果返回給調用者,只需簡單的調用setResult()方法來指定具體的結果代碼和結果Intent對象。當操作完成後,並要返回到最初的調用者,就要調用finish()方法來關閉(或銷毀)被調用的Activity,例如:

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();

你必須要返回結果中指定結果代碼。通常它應該是RESULT_OK或RESULT_CANCELED。然後根據需要使用一個Intent對象來提供另外的數據。

注意:默認的結果會被設置為RESULT_CANCELED。因此,在操作完成和結果被設定之前,如果用戶按下返回按鈕,那麼初始的Activity就會收到“被取消”的結果。

如果你只是簡單的返回一個整數,來指明幾個可選結果中的一個,那麼你把結果代碼設置為任何比0大的值。如果你使用結果代碼來發送一個整數,並且不需要包含Intent對象,那麼你就可以調用setResult()方法,並且只給它傳遞一個結果代碼。例如:

setResult(RESULT_COLOR_RED);
finish();

在這種情況中,可能的結果很少,因此結果代碼可以是本地定義的整數(比0大)。這樣在把結果返回給你自己應用程序中的Activity時,就會很好的工作,因為接收結果的Activity可以引用公共的常量來判斷結果代碼的值。

注意:不需要檢查你的Activity是使用startActivity()方法、還是使用startActivityForResult()方法來啟動的。如果啟動你的Activity期望要有返回結果,那麼只需簡單的調用setResult()方法就可以了。如果啟動Activity調用的是startActivityForResult()方法,那麼系統就會把你提供給setResult()方法的結果發送給它,否則,這個結果會被忽略。

 

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