Почему TileService ждет несколько секунд, чтобы начать действие?

Я использую 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должен быть воссоздан в первую очередь, что занимает слишком много времени.

Я не уверен, куда идти отсюда - если мои догадки верны.

РЕДАКТИРОВАТЬ: В качестве важного дополнения, я могу воспроизвести это на OnePlus 7 Pro работает на Android Pie. Это может быть проблема, связанная с 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()
    }
}

Манифесты

<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>
Другие вопросы по тегам