「繼續」功能導入了新的方法和類別,可讓您指出對該功能的支援,並提供傳遞所需的必要資料。這樣一來,您就能在接收裝置上正確恢復使用者體驗。
支援
您必須為每項活動分別導入「繼續」支援功能 (預設為關閉)。如要啟用這項功能,請呼叫 setHandoffEnabled,將目前活動標示為可接力。呼叫 setHandoffEnabled(true, null) 後,活動隨時可能接力,因此請務必在活動準備好接力時再呼叫。
您可以使用 isHandoffEnabled 檢查活動是否已啟用「繼續」功能。如果活動已啟用接力功能,也必須實作 onHandoffActivityDataRequested,確保傳回非空值的 HandoffActivityData,因為系統不會實作預設行為。
class MyHandoffActivity : Activity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Do stuff
...
// Enable handoff
setHandoffEnabled(true, null)
}
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Create and return handoff data
}
}
您可以使用任何相關額外項目和備用 URI 設定 HandoffActivityData 物件,告知「繼續」如何執行交接至接收裝置。
系統在以下兩種情況下需要這項資料:
- Activity 進入背景,必須儲存相關資料。
- 活動位於前景,且已要求接力。您可以查看交接要求的狀態。
檢查狀態
HandoffActivityDataRequestInfo 類別提供目前要求交接活動的相關資訊。使用 isActiveRequest 判斷要求目前是否有效。如果方法傳回
- true,表示目前活動位於前景,且使用者已要求在其他裝置上繼續,但如果
- false:活動已停止並在背景執行,但使用者日後可能會要求接力。
在傳送裝置上,如要顯示 UI 向使用者指出接力已發生或正在進行中,可以檢查 isActiveRequest 是否有進行中的要求。不過,請勿將這段程式碼做為 onHandoffActivityDataRequested 的一部分同步執行。請改為將任何程式碼排入佇列,以非同步方式執行,以免封鎖或延遲交接。
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Check whether the handoff request is active
if (handoffRequestInfo.isActiveRequest()) {
// Asynchronously show UI to let users know a handoff is in progress
}
// Create and return handoff data
}
建立接力資料
為確保使用「繼續」功能接續執行時,所有相關和必要資料都能傳遞,您必須在 HandoffActivityData 物件中加入資料。
HandoffActivityData 類別代表與活動相關聯的接力資料。HandoffActivityData 會告知「繼續先前的活動」功能,如何在接收裝置上處理及重新建立活動。交接資料包括:
- 元件名稱 (必要):在接收裝置上啟動的對應活動
ComponentName,以便在接力後繼續使用者歷程。在大多數情況下,為了精確複製活動,這會是建立HandoffActivityData的相同活動的元件名稱。 - Extras (選用):您可以指定要納入活動啟動
Intent的額外項目。這是一個PersistableBundle,可用來為元件提供額外資訊。額外內容必須小於 50 KB。
如要建立 HandoffActivityData 物件,請使用建構工具類別 HandoffActivityData.Builder。傳遞應接收接續互通的活動 ComponentName (例如目前 Activity 的 this.getComponentName,或明確的 ComponentName(this, TargetActivity::class.java)),藉此建構新的建構工具。接著,使用 setExtras 方法選擇性指定額外項目。最後,呼叫 build 建立 HandoffActivityData 物件。
// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
// Check whether the handoff request is active
if (handoffRequestInfo.isActiveRequest()) {
// Asynchronously show UI to let users know a handoff is in progress
}
val extras: PersistableBundle = PersistableBundle()
// Put relevant and necessary values into extras (e.g. scroll position)
extras.putString("data_id", getDataId())
extras.putInt("scroll_position", getScrollPosition())
// Create and return handoff data
return HandoffActivityData.Builder(getComponentName()) // Designate handoff to the same activity
.setExtras(extras)
.build()
}
設定網頁備用選項
如果無法在接收裝置上啟動指定活動,您也可以使用 setFallbackUri 設定備用網址,在裝置上以使用者的預設瀏覽器開啟。
如要允許「繼續」建議顯示在未安裝應用程式的接收裝置上,請在呼叫 setHandoffEnabled 時,傳遞 HandoffActivityParams 例項,並將 setAllowHandoffWithoutPackageInstalled 設為 true:
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
接著在 HandoffActivityData 中加入備用網址:
val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.setFallbackUri(fallbackWebLink)
.build()
直接導入至網站
或者,如要實作直接移轉至網頁,請將 HandoffActivityParams 與 setAllowHandoffWithoutPackageInstalled(true) 傳遞至 setHandoffEnabled,並使用 HandoffActivityData.createWebHandoff 方法產生 HandoffActivityData:
val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)
val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)
接收及處理轉接意圖
在接收裝置上,應用程式必須處理接力作業,並從傳送裝置重新建立使用者的體驗。具體來說,在 onHandoffActivityDataRequested 傳回的 HandoffActivityData 中指定的活動中,您需要處理意圖,並擷取包含如何適當重建活動資訊的額外資訊。
如果您指定將接續互通作業交給同一個活動,可以在活動的 onCreate 方法中接收意圖,以便擷取資料並為使用者預先填入適當內容。
class MyHandoffActivity : Activity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Do stuff
...
// Get the launch intent and retrieve extras
val intent: Intent = getIntent()
if (intent != null && intent.hasExtra("data_id")) {
val dataID: String = intent.getStringExtra("data_id")
// Retrieve the data that corresponds to the data ID
...
// Populate activity UI with relevant data
...
if (intent.hasExtra("scroll_position")) {
val scrollPosition: Int = intent.getIntExtra("scroll_position", 0)
// Move the page to the scroll position
...
}
}
}
}