电子书阅读器上的浏览器 [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

这样子就完成啦。下面我们来看一下完成後的操作。

示范影片


<<:  【在 iOS 开发路上的大小事-Day13】Firebase 你好啊!

>>:  2021-Day20. Serverless(八):Google Container Registry - Intro

Day8:EndPoint for Microsoft Defender 警示和事件

当我们布署完Microsoft Defender for Endpoint 接下来当侦测到威胁时,系...

一条龙,你会了吗 - 用Django建立整合AD登入

说明 本篇将继续介绍使用django-social-auth设定整合Activate Directo...

Day 2【Project 分析、Metamask】Why is Microsoft Word the best IDE for programming?

【前言】 这篇文章要来分析我负责的整个项目,并且准备所有我需要的东西! 【(使用者看见的)前端与(...

Day23-JDK可视化监控工具:jconsole(三)

前言 这篇还是要继续来介绍jconsole,Thread的页签介绍 Step.1 首先准备一个Jco...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day12

tags: ItIron2021 Javascript 前言 昨天我们快速带过闭包的概念,俗话说打铁...