雖然 browser 已經可以支援多個分頁瀏覽了(全在同一個 Activity
中做切換),但有些時候還是需要有另一個裝載 WebView
的 Activity
。
舉例來說,現在我可能用 browser 在播放 Youtube 影片;這時,如果我切換到別的分頁想看其他內容時, Youtube 影片的分頁會因為被移到背景而停止多媒體的播放,僅讓目前前景的 WebView
是有作用的。
這麼做的原意是希望當開了很多分頁時,背景的分頁不會在背後偷偷作事,拖慢前景的載入。
那麼,要怎麼利用多 Activity
來達成上面的應用場景呢?目前 BrowserActivity
已經有支援在最上層的分頁,在 App 進入背景後,能持續播放。在這個前提下,如果我能再長出一個一模一樣的 BrowserActivity
instance,就能在新的 instance 中做其他的事情。
原以為只是單純的新增一個按鈕,讓它在被點擊時產生新的 BrowserActivity
instance 就好。但是,事情卻沒有想像中的這麼簡單。 BrowserActivity
的 launchMode 設定是 singleInstance
。當初這麼設定是因為要讓它只有一個 instance 可以接受其他 App 傳來的開網頁需求。因為 singleInstance
屬性的關係,它在系統內永遠只會存在一個實例,無法再建出第二個 BrowserActivity
來。
<activity
android:name="de.baumann.browser.activity.BrowserActivity"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|uiMode|screenLayout|smallestScreenSize"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@style/AppTheme"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden">
既然這條路行不通,只好另闢蹊徑:建立另一個 Activity
,讓它繼承自 BrowserActivity
。首先,要將 BrowserActivity
class 改為 open:
open class BrowserActivity : AppCompatActivity(), BrowserController, OnClickListener { ... }
再來是建立 ExtraBrowserActivity
class
// in AndroidManifest.xml
<activity
android:name="de.baumann.browser.activity.ExtraBrowserActivity"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize|uiMode|screenLayout|smallestScreenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:windowSoftInputMode="adjustResize|stateAlwaysHidden"/>
// in source codes
class ExtraBrowserActivity : BrowserActivity()
當新建的按鈕被點擊時,必須 launch 這個新的 Activity
:
private fun launchNewBrowser() {
val intent = Intent(this, ExtraBrowserActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
action = ACTION_VIEW
data = Uri.parse(config.favoriteUrl)
}
startActivity(intent)
}
因為希望這個新建立的 Activity
也可以出現在 Recent Apps 列表中,所以 intent
必須要加入設定 Intent.FLAG_ACTIVITY_NEW_DOCUMENT
。
這樣子就完成啦。下面我們來看一下完成後的操作。