为什么TileService等待几秒钟来启动Activity?

时间:2019-07-09 20:49:23

标签: android android-service android-app-quick-setting

我使用TileService作为打开应用程序Activity的快捷方式。它只是这样做,并且没有状态。

它看起来像这样:


class QuickAccessTileService : TileService() {

    override fun onClick() {
        super.onClick()

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

        startActivityAndCollapse(intent)
    }
}

,它在AndroidManifest中声明为:

<service
    android:name=".service.QuickAccessTileService"
    android:icon="@drawable/ic_home"
    android:label="@string/tile_label"
    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">

    <intent-filter>
        <action android:name="android.service.quicksettings.action.QS_TILE" />
    </intent-filter>
</service>

按目前的情况工作。但是,当我的应用程序停止运行时,下次我尝试通过快速设置面板 打开该应用程序时,它需要几秒钟才能开始活动。

这就是我所知道的:

该活动本身并不慢就开始。尝试通过启动器 打开它,这很清楚。

Service似乎需要花费一段时间才能开始执行onClick。这说得通; Service可能不会在后台运行,而该应用程序没有运行。但是,这意味着当系统检测到对我的Tile的点击时,必须首先重新创建 Service ,这会花费很长时间。

如果我的猜测正确,我不确定该从哪里去。

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

1 个答案:

答案 0 :(得分: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()
    }
}

清单

<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>