为什么 TileService 会等待几秒钟才能启动 Activity?

Bap*_*ier 5 android android-service android-app-quick-setting

我使用 aTileService作为快捷方式来打开我的应用程序的Activity. 它只做那个,没有状态。

它看起来像这样:


class QuickAccessTileService : TileService() {

    override fun onClick() {
        super.onClick()

        val intent = Intent(this, SlideOverActivity::class.java)
            .addFlags(FLAG_ACTIVITY_NEW_TASK)

        startActivityAndCollapse(intent)
    }
}
Run Code Online (Sandbox Code Playgroud)

它声明AndroidManifest为:


class QuickAccessTileService : TileService() {

    override fun onClick() {
        super.onClick()

        val intent = Intent(this, SlideOverActivity::class.java)
            .addFlags(FLAG_ACTIVITY_NEW_TASK)

        startActivityAndCollapse(intent)
    }
}
Run Code Online (Sandbox Code Playgroud)

就目前而言,这是有效的。但是,当我的应用程序停止时,下次我尝试通过快速设置面板打开它时,需要几秒钟才能启动该活动。

这是我所知道的:

Activity 本身启动起来并不慢。尝试通过启动器打开它会很清楚。

Service似乎是什么服用一段时间才能开始之前,onClick甚至执行。这说得通; Service当应用程序没有运行时,它可能不会在后台运行。然而,这意味着,当系统检测到我的点击TileService首先必须重建,这需要的时间太长了。

我不知道从哪里开始——如果我的猜测是对的。

编辑:作为一个重要的补充,我可以在运行 Android Pie 的 OnePlus 7 Pro 上重现这一点。这可能是 OnePlus 特定的问题,因为我无法在模拟器上重现它。

小智 0

@RequiresApi(Build.VERSION_CODES.N)
class TileSettingClass : TileService() {

    override fun onClick() {

        super.onClick()

        val tile = qsTile
        if (tile.state == Tile.STATE_INACTIVE) {
            tile.state = Tile.STATE_ACTIVE
            val intent = Intent(this.applicationContext, YourActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.action = "yourAction"
            applicationContext.startActivity(intent)
        } else {
            tile.state = Tile.STATE_INACTIVE
        }
        tile.updateTile()
    }
}
Run Code Online (Sandbox Code Playgroud)

舱单

<service
    android:name=".main.service.TileSettingClass"
    android:icon="@drawable/ic_tile_setting"
    android:label="@string/milliy"
    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
    >
    <intent-filter>
        <action android:name="android.service.quicksettings.action.QS_TILE" />
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)