網絡活動API(WebActivity API)
-
WebActivity API為應用程序提供一種 將自身活動委托給另一個應用的方法
-
活動(Web Activity)是用戶想要做的事情,如選擇圖像,播放視頻等
-
應用程序可以聲明自己是活動處理者(Activity Handler)
-
例如,當用戶請求選擇照片時,Gallery應用程序和已安裝的第三方照片管理應用程序都可以作為候選項
-
通常會向用戶提供這樣的一個選擇列表。
-
-
WebActivity接口同時暴露在Window和Worker作用域中
-
在Window中,當想發出請求的應用程序可見時(在前台),則允許創建WebActivity
-
在Worker中,如果聲明並授予了worker-activity權限,則允許創建WebActivity
- 否則將引發不安全的錯誤,WebActivity的創建將返回nullptr
-
啟動一個活動
WebActivity的構造函數使用活動名稱
和可選的對象
,指定其篩選器類型或其他信息,例如:
let activity = new WebActivity ( "pick" , { type : "image/ipeg" } ) ;
在本例中,我們嘗試啟動一個“pick”活動,活動處理者程序(Activity Handler)應至少支持提供jpeg圖像的選取。
注意,構造函數可能拋出並返回非法訪問的空對象(null)。
然后,通過start()方法啟動activity,如果啟動了活動處理者程序(activity handler,在此即Gallery應用)並成功處理了請求,則將reolve出選取對象的promise出來。
activity.start().then(
rv => {
console.log("Results passed back from activity handler:")
console.log(rv);
},
err => {
console.log(err);
}
);
注意,一個WebActivity的實例只可啟動一次,重復調用start()將被拒絕。
取消一個活動
要取消已啟動的活動,請使用cancel(),並且start()掛起的承諾(pending promise)也將被拒絕(rejected)
activity.cancel();
處理一個活動
一旦用戶選擇了活動處理者程序(或由系統應用程序默認隱式選擇),名為activity的 SystemMessageEvent 將被派發到其服務工作程序(Service Worker)上的事件處理程序,與其他的系統消息不同,SystemMessageData 具有屬性 WebActivityRequestHandler,它提供了解決(resolve)或拒絕(reject) activity.start()掛起承諾(pending promise)的方法。
注意,根據 ServiceWorkerGlobalScope[1] 的規范,活動處理程序(ActivityHandler)不會在工作線程中或者重新啟動的周期內持久化。更多信息,請參閱 ServiceWorkerGlobalScope。
[1] 開發者應記住,ServiceWorker的狀態不會在終止/重新啟動周期中持久化,因此每個事件處理程序都應該假設它是用一個默認的全局狀態調用的。
在處理名為 activity 的 systemmessage 事件時,處理程序可以使用 ServiceWorker API, Clients.openWindow()
來決定是否啟動應用程序窗口以執行用戶交互。或者可以直接使用 WebActivityRequestHandler.postResult()
傳回結果。建議使用 postMessage() 方法在主腳本(main scripts)和服務工作腳本(service worker script)之間進行通信。
如果出現問題,請使用 WebActivityRequestHandler.postError()
發回錯誤消息。
WebActivityRequestHandler.source
是 WebActivityOptions
對象,表示從活動請求者處發送的信息。
-
WebActivityOptions
-
名稱(name),字符串,表示活動請求處的名稱
-
數據(data),對象,表示從活動請求者處發送的數據
-
self.onsystemmessage = e => {
try {
let handler = e.data.webActivityRequestHandler();
console.log("activity payload:");
console.log(handler.source);
let fakeResult = { images: ["a.jpeg", "b.png"], type: "favorite" };
handler.postResult(fakeResult);
} catch (err) {
console.log(err);
}
};
-
WebActivityRequestHandler
-
source,WebActivityOptions對象,包含有關當前活動的信息。由啟動活動的應用程序設置。
-
postResult(),發回響應並解析啟動活動的應用程序的promise。
-
postError(),發回錯誤消息並拒絕啟動活動的應用程序的promise。
-
用 Clients.openWindo w打開它的窗口
待定
將應用程序注冊為活動處理程序
-
應用程序可將自身注冊為活動處理程序,以處理一個或多個活動。
-
需要在應用程序清單中聲明活動相關信息
-
需要在應用程序清單中設置服務工作者腳本
-
示例如下:
-
設置ServiceWorker注冊
"serviceworker": {
"script_url": "script_url",
"options": {
"scope": "scope_of_sw",
"update_via_cache": "value_of_update_via_cache"
}
},
options對象是可選的,如 ServiceWorkerContainer.register() 語法中所定義,例如:
"serviceworker": {
"script_url": "sw.js"
},
在大多數情況下,上面的例子已經足夠用了。
設置Activity Handler注冊
一般來說,請參考將應用程序注冊為活動處理程序
活動處理程序描述的新屬性和更新
-
【刪除】href,指定打開的地址
- 無需再指定href
-
【刪除】disposition,指定打開的方式(window/inline)
- 無需再指定dispotion
-
【可選】filters,過濾器
- 同之前
-
【可選】returnValue,返回值
- 同之前
-
【新增】【可選】allowedOrigins,允許來源
-
數組,這是為了處理程序將其使用限制為特定用戶,將篩選出其來源不在列表中的呼叫者(caller)
-
例如,設置 "AllowedOriginates": ["http://testapp1.localhost", "http://testapp2.localhost“]
-
僅允許從 "http://testapp1.localhost" 或 "http://testapp2.localhost" 中發出請求
-