【问题标题】:Android IntentService and stateAndroid IntentService 和状态
【发布时间】:2011-11-03 09:55:52
【问题描述】:

我喜欢 IntentService,并在我必须编写服务时尝试使用它。

但是,当应用程序启动时,我必须至少执行一次长时间的任务(约 4 秒)。任务是加载原始资源(证书)并将其用于所有 Web 服务调用。目前我每次调用 Web 服务时都会加载它,这显然不是一个真正的解决方案。

因为 IntentService 是无状态的,我无法在请求之间保留证书。除了编写“正常”服务并仔细实施生命周期以检查何时应该(重新)加载证书之外,我还有什么选择。

谢谢。

【问题讨论】:

    标签: android intentservice


    【解决方案1】:

    任务是加载原始资源(证书)并将其用于所有 Web 服务调用。

    加载原始资源需要几毫秒。使用 Traceview 找出为什么需要大约 4 秒。

    目前我每次调用 web 服务时都会加载它,这显然不是一个真正的解决方案。

    每次加载原始资源似乎是一个完美可行的解决方案。这不像你有其他选择。

    除了编写“正常”服务并仔细实施生命周期以检查何时应该(重新)加载证书之外,我还有哪些选择。

    那真是个坏主意。

    用户非常不喜欢那些在不应该运行服务时保持服务运行的开发人员。用户使用任务杀手和设置中的强制停止来攻击这样的应用程序。一旦发生这种情况,在 Android 3.1+ 上,您的应用将永远不会再次运行,直到用户启动您的一项活动。

    此外,Android 将在一段时间后终止您的永久服务,再次保护用户免受编写不佳的服务。

    专注于优化约 4 秒的操作。

    【讨论】:

    • 你是对的,阅读资源似乎没问题。我使用 traceview 查看发生了什么,似乎有问题的方法在 BouncyCastle 库中。 org.bouncycastle.crypto.digests.SHA1Digest.processBlock 的独占时间为 4093。它还有 4078 次递归调用。
    • 不确定我之前的评论有多准确,我可以说有问题的代码是KeyStore ks = KeyStore.getInstance(KEY_STORE_TYPE); ks.load(stream, password);
    • @Jack:我没有用javax.crypto 解码证书,所以我不知道这是否是预期的持续时间。当然看起来很长。您可以做的一种解决方法是将生成的KeyStore 缓存在静态数据成员中。您没有说明调用IntentService 的频率。当警报(?)或任何触发机制发生并且服务再次启动时,您的进程仍有可能存在。在这种情况下,您可以使用缓存的KeyStore,而不是再次重新加载它。这样,您可以保留IntentService,并且您的某些运行百分比可以跳过开销。
    • 我会看看这个,但我认为 IntentService 在完成onHandleIntent(Intent intent) 后被销毁。无论如何,该服务的调用频率并不高,所以我想它很有可能不会仍然存在。
    • @Jack:“我认为 IntentService 在完成后被销毁了”——如果工作队列为空的话。但是,仅仅因为 service 被销毁并不意味着 process 被终止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多