【问题标题】:Why does TileService wait several seconds to start an Activity?为什么 TileService 会等待几秒钟才能启动 Activity?
【发布时间】:2019-07-09 20:49:23
【问题描述】:

我使用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>

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

这是我所知道的:

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

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

如果我的猜测是正确的,我不知道该去哪里。

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

【问题讨论】:

  • 如果您还没有这样做,请覆盖QuickAccessTileService 中的onCreate()onBind(),链接到超类并记录它们被调用的时间。还要记录调用onClick() 的时间。这有望为您提供一些线索,了解该过程的哪个步骤是缓慢的:创建服务缓慢,创建后绑定缓慢,绑定后调用onClick() 缓慢,或响应您的startActivityAndCollapse() 缓慢实际显示活动。
  • 同意。这是否可以跨多个设备和操作系统版本重现?
  • 目前,我可以在 OnePlus 7 Pro API 27 上重现这一点。我可以发誓这也发生在几周前的模拟器上;要么我记错了,要么我不小心把它修好了,因为我一辈子都无法在任何 Android 版本上复制它。所以这毕竟可能是一个 OnePlus 问题。 ://
  • @CommonsWare,我可以在华为API 26上重现这个,不仅onClick,onStartListening延迟,甚至根本不执行。
  • @zhongshu:我最好的猜测是这是一个特定于制造商的问题,他们弄乱了通知栏的工作方式,干扰了第三方磁贴。

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


【解决方案1】:
@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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多