--- title: Web Activities slug: WebAPI/Web_Activities translation_of: Archive/B2G_OS/API/Web_Activities ---
{{ non-standard_header() }}
{{B2GOnlyHeader2('installed')}}
Web Activities 即定義「App 將 Activity 委託 (Delegate) 予另一個 App (往往是由使用者所選擇)」的方法。
Web Activities 目前僅能用於 Firefox OS 上,而完整規格可參閱 WikiMo。
所謂「Activity」就是使用者想做的事情,如選取影像、傳送電子郵件等。App 開發者可能會定義某個 App 去處理該 Activity,或定義某個 App 委託予 Activity。
App 開發者可建構 App 以處理單或多個 Activity。也就是說,這個 App 可經由其他 App 呼叫之後,而執行 Activity 所定義的某些特定動作。舉例來說,我們可能用其他 App 呼叫相片管理 App,進而選取相片。若 App 是作為 Activity Handler,就會成為其他 App 作業流程的一部分。
如果要將 App 註冊為 Activity Handler,目前唯一方法就是到 App 的 manifest 檔案中宣告。
注意:任何 App 均可針對現有的 Activity,將本身註冊為 Activity Handler;亦可建立自己的 Activity。不論是哪種情況,對 manifest 檔案的處理方式都相同。但若要建立新的 Activity,最好是在新 Activity 名稱的前方加上網址 (例如 example.org/myActivity 或 org.example.myActivity),以避免發生衝突。
如同下列範例所示,必須透過 App 的 manifest 檔案,宣告 App 將會處理 Activity:
{
// Other App Manifest related stuff
// Activity registration
"activities": {
// The name of the activity to handle (here "pick")
"pick": {
"href": "./pick.html",
"disposition": "inline",
"filters": {
"type": ["image/*","image/jpeg","image/png"]
},
"returnValue": true
}
}
}
透過 navigator 物件,即可讓 App 動態的註冊自己。但目前尚未提供此 API。可留意 bug 775181 以持續追蹤此 API。
hrefhref 將指定所應開啟的網頁。另可透過 disposition 屬性指定網頁的開啟方式。
disposition {{optional_inline()}}href 所指定的頁面」呈現方式。其值必為下列之一 (若略過不設定,則預設為 window):
window ─ 只要是處理 Activity 的頁面,均將以新視窗開啟之;若在行動裝置上,則是以此畫面取代「請求該 Activity 的原始 App」。頁面必須針對自己所支援的各個 Activity,呼叫 navigator.mozSetMessageHandler(),再執行「接收到訊息」的Activity。inline ─ 將以覆蓋原頁面的方式,開啟「處理 Activity 的頁面」;若在行動裝置上,則會在「請求該 Activity 的原始 App」上彈出框。如果 disposition 同樣是 window,則後續動作將一模一樣。returnValue {{optional_inline()}}MozActivityRequestHandler.postResult();反之則呼叫 MozActivityRequestHandler.postError()。此處 Activity Handler 中,將於 mozSetMessageHandler 指定第一引數的類型,其實就是 MozActivityRequestHandler。在事件處理器呼叫了 postResult 或 postError 之後,將分別觸發 success 或 error 事件。filters {{optional_inline()}}MozActivityOptions 的 data 屬性名稱。篩選器的值可能為基本數值 (數字或字串)、基本數值構成的陣列,或篩選器的定義物件。任一 Activity 必須先滿足所有篩選器之後,才會決定是否要處理其他 Activity。根據各個篩選器數值的不同,處理篩選器的方式也有所差異:
MozActivityOptions.data 屬性。但若屬性已存在,則必須與篩選器所具備的數值相同。MozActivityOptions.data 屬性。但若屬性已存在,則必須與篩選器所具備的數值陣列之一相同。MozActivityOptions.data 屬性只要遵守物件所定義的規範,即可滿足篩選器。篩選器定義物件可為下列屬性:
required:此 Boolean 值將指出對應的 MozActivityOptions.data 屬性,必為存在 (true) 或不存在 (false)。value: :基本數值或基本數值構成的陣列。相對應的 MozActivityOptions.data 屬性值,必須與篩選器中定義的數值之一相同。min:如果所需的數值為數字,則相對應的 MozActivityOptions.data 屬性值必須大於或等於該值。max:如果所需的數值為數字,則相對應的 MozActivityOptions.data 屬性值必須小於或等於該值。pattern:字串形式必須遵照 JavaScript 正規表示式 (Regular expression) 語法。相對應的 MozActivityOptions.data 屬性值必須符合該形式。從 Firefox OS v1.2 起即支援此屬性。patternFlag:若使用了 pattern 屬性,則必須透過此屬性提供某些額外的正規表示式旗標 (如 i 或 g)。從 Firefox OS v1.2 起即支援此屬性。regexp:此字串包含的正規表示式內容,均遵循 JavaScript 正規表示式的語法。其對應的 MozActivityOptions.data 屬性值必須符合該樣式。與上方的 pattern 欄位相較,regexp可以只針對字串中間的部分值做比對;因此若要比對字串頭與字串尾,就必須使用 metacharacters 的「^」與「$」分別,即可與 patternFlag 一樣進行完全比對。目前僅限 Firefox OS v1.0 與 v1.1 支援此屬性。因此建議同時使用 pattern 與 regexp。一旦把 App 宣告為 Activity Handler 之後,我們就必須在實作中處理其他 App 所傳來的 Activity 請求。
若要處理 Activity,就必須註冊「執行所有必要動作」的函式。先透過 navigator.mozSetMessageHandler() 來設定訊息處理器 (Message handler),並特別指派至「activity」訊息 (不能為 Activity 的名稱)。接著將傳入 MozActivityRequestHandler 物件,以作為 Activity Handler 函式的參數。
navigator.mozSetMessageHandler('activity', function(activityRequest) {
// Do something to handle the activity
});
在 Activity Handler 函式執行動作時,將透過 Activity 請求而檢索 Activity 的相關資訊,並依需要而回傳答案。
另外,呼叫 Activity 的 App 必須提供某些資料 (請參閱下表)。而透過請求的 source 屬性 (亦為 MozActivityOptions 物件) 即可取得這些資料。該物件將提供 Activity 呼叫的 name 與相關 data。
navigator.mozSetMessageHandler('activity', function(activityRequest) {
var option = activityRequest.source;
if (option.name === "pick") {
// Do something to handle the activity
}
});
一旦執行所有動作以處理 Activity 之後,我們就可以呼叫請求的 postResult() 函式,針對委託該 Activity 的 App,回傳所需的結果。
如果發生錯誤,則可呼叫請求的 postError() 函式,以回傳該 Activity 的錯誤訊息。
navigator.mozSetMessageHandler('activity', function(activityRequest) {
var option = activityRequest.source;
if (option.name === "pick") {
// Do something to handle the activity
...
// Send back the result
if (picture) {
activityRequest.postResult(picture);
} else {
activityRequest.postError("Unable to provide a picture");
}
}
});
注意:如果並未呼叫 postError 或 postResult(),則均應由 UA 送出錯誤訊息;例如使用者離開了 App (關閉桌面上的分頁,或回到行動裝置的首頁) 的情形。
就 Web Activities 的另一方面來說,就是有 App 會將 Activity 委託予我們的 App。若要執行這種委託作業,則 App 必須建立 (Instantiate) MozActivity 物件,進而呼叫 Activity。這種物件其實就是 DOMRequest 物件,可等待來自於 Activity Handler 的任何反應。只要建立了物件之後,就會開始 Activity (也會立刻為使用者顯示 UI)。
var activity = new MozActivity({
// Ask for the "pick" activity
name: "pick",
// Provide de data required by the filters of the activity
data: {
type: "image/jpeg"
}
});
activity.onsuccess = function() {
var picture = this.result;
console.log("A picture has been retrieve");
};
activity.onerror = function() {
console.log(this.error);
};
Gaia 即為 Firefox OS 的原生介面,並已內建許多 App 以定義基本的 Activity。這些 Activity 如下:
| Name | Application | Expected Data (filters) | Comments |
|---|---|---|---|
browse |
Gallery |
type: "photos" |
|
configure |
Settings |
target: "device" |
|
costcontrol/balance |
Costcontrol | None | |
costcontrol/data_usage |
Costcontrol | None | |
costcontrol/telephony |
Costcontrol | None | |
dial |
Communication |
type: "webtelephony/number",
number: {
regexp:/^[\\d\\s+#*().-]{0,50}$/
}
|
當 App 要傳送一通電話時使用。 |
new |
Communication |
type: "webcontacts/contact" |
當 App 要建立新的聯絡人資料時使用。 |
type: "mail" |
|||
| SMS |
type: "websms/sms",
number: {
regexp:/^[\\w\\s+#*().-]{0,50}$/
}
|
當 App 要傳送一封文字簡訊時使用。 | |
open |
Communication |
type: "webcontacts/contact" |
|
| Gallery |
type: [ "image/jpeg", "image/png", "image/gif", "image/bmp" ] |
||
| Music |
type: [ "audio/mpeg", "audio/ogg", "audio/mp4" ] |
||
| Video |
type: [ "video/webm", "video/mp4", "video/3gpp", "video/youtube" ] Also expect a |
當 App 要顯示影片時使用 (而 view 的Activity 同樣可辦到) 。 |
|
pick |
Camera, Gallery, Wallpaper |
type: ["image/*", "image/jpeg"] |
當 App 要取得圖片時使用。 |
| Communication |
type: [ "webcontacts/contact", "webcontacts/email" ] |
當 App 要檢索某個聯絡人資訊或電子郵件時使用。 | |
record |
Camera |
type: ["photos", "videos"] |
當 App 要錄製影片時使用。 |
save-bookmark |
Homescreen |
type: "url",
url: {
required:true,
regexp:/^https?:/
}
|
|
share |
Bluetooth |
number: 1 |
|
| Email, Wallpaper |
type: "image/*" |
當 App 要分享圖片時使用。 | |
view |
Browser |
type: "url"
url: {
required: true,
regexp: /^https?:.{1,16384}$/
}
|
當 App 要開啟 URL 時使用。 |
type: "url",
url: {
required:true,
regexp:/^mailto:/
}
|
|||
| PDFjs |
type: "application/pdf" |
當 App 要顯示 PDF 文件內容時使用。 | |
| Video |
type: [ "video/webm", "video/mp4", "video/3gpp", "video/youtube" ] Also expect a |
當 App 要顯示影片時使用 (而 open 的 Activity 同樣可辦到)。 |
|
update |
Communication |
type: "webcontacts/contact" |
當 App 要更新聯絡人時使用。 |
Web Activities 目前尚不屬於任何規格,但其中某些部分與當前的 Web Intents 有所重複。事實上,Mozilla 規劃 Web Activities 正是想提議用以替代 Web Intents。若要進一步了解相關資訊,可參閱 Web Intents Task Force ML 上的討論。