【问题标题】:onTaskRemoved called after onCreate in started service on swipe-out from recent app listonTaskRemoved 在从最近的应用程序列表中刷出时启动的服务中的 onCreate 后调用
【发布时间】:2015-08-26 10:32:24
【问题描述】:

我有一个从 Activity 启动的服务,该服务运行良好 onCreate, onStartCommand 被正确调用。在设置-->运行应用程序中显示1 process and 1 service
现在,当我从最近的应用程序列表中刷出我的应用程序时。该服务重新创建,在设置-> 运行应用程序中显示 0 process and 1 service restarting...onCreateonStartCommandonTaskRemoved 调用。

现在的问题是在一个应用程序onTaskRemoved 在刷出应用程序后立即调用然后onCreate 调用,而在另一个应用程序onTaskRemoved 需要时间并在onCreate 之后调用。

为什么会有这种不同的行为?任何建议都会帮助我。请提供您的 cmets 和观察结果。

08-26 15:43:48.611: D/PassiveService(15359): PASS_IVE, onCreate...
08-26 15:43:48.611: I/PassiveService(15359): PASS_IVE, registerReceivers...

刷出后

08-26 15:44:05.789: D/PassiveService(15499): PASS_IVE, onCreate...
08-26 15:44:05.809: I/PassiveService(15499): PASS_IVE, registerReceivers...
08-26 15:44:05.839: I/PassiveService(15499): PASS_IVE, onTaskRemoved...

【问题讨论】:

    标签: android android-service kill-process


    【解决方案1】:

    如果我们正在执行任何繁重的 UI 相关工作或向服务中的接收者广播消息,通常会延迟调用正在运行的服务的 onTaskRemoved(当应用从最近的应用中滑出时) /strong>。

    例如, 假设您正在从 Web 服务器下载大小为 50MB 的文件,因此每次您从 Web 服务器读取 1024 字节的流数据作为缓冲区并将数据写入设备中的文件时.

    同时,您正在向 UI 线程更新进度,这意味着您正在向 UI 线程更新每个 KB,这将导致应用程序冻结。

    所以如果你从最近的应用列表中滑出,那么系统会尝试停止服务,但是由于服务与UI线程接触,系统将无法停止该服务,但是它会创建新服务,即使旧服务还没有停止。

    一旦旧服务完成与 UI 线程的通信,就会调用 onTaskRemoved() 并停止旧服务。新服务将在后台运行。

    【讨论】:

    • "所以如果你从最近的应用列表中滑出,那么系统会尝试停止服务,但由于服务与UI线程接触,系统将无法停止该服务,但即使旧服务尚未停止,它也会创建新服务。”这有什么意义?当系统想要停止它时,它为什么会尝试创建新服务?
    • 从我注意到Android中的Service只是一团糟,你在生命周期中有onDestroy,但不能依赖它。有时这就像对开发人员的一个玩笑。缺少清理状态,您可以在暂停时执行操作,但对于大多数用例而言,它为时过早。
    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多