iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
Mobile Development

如何開發適合電子書閱讀器使用的瀏覽器 Android APP系列 第 25

電子書閱讀器上的瀏覽器 [Day25] 支援多 Activity

雖然 browser 已經可以支援多個分頁瀏覽了(全在同一個 Activity 中做切換),但有些時候還是需要有另一個裝載 WebViewActivity

舉例來說,現在我可能用 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

這樣子就完成啦。下面我們來看一下完成後的操作。

示範影片


上一篇
電子書閱讀器上的瀏覽器 [Day24] 翻譯功能 (VI) 翻譯結果與主畫面同步捲動
下一篇
電子書閱讀器上的瀏覽器 [Day26] 保持畫面不會自動關閉
系列文
如何開發適合電子書閱讀器使用的瀏覽器 Android APP30

尚未有邦友留言

立即登入留言