【问题标题】:Should I use intent service?我应该使用意图服务吗?
【发布时间】:2012-02-29 15:42:36
【问题描述】:

我有一个用户登录屏幕。用户按下登录按钮,我创建了一个 IntentService 以连接到我的其余服务并返回身份验证结果。

现在这是我想要实现的功能:如果活动暂停(即进入后台),那么意图服务应该仍然运行,并且确实如此。但是如果我使用任务管理器来终止应用程序,意图服务应该停止,尽管现在它没有。它继续执行onHandleIntent 直到完成。如果我手动调用stopSelf(),则会调用onDestroy(),但onHandleIntent 方法会继续执行。如何强制onHandleIntent 停止?调用“return”不是一种选择,因为它可能会在一个 rest 方法调用中被赶上。

我应该为这个功能使用 Intent 服务还是其他东西(如服务或异步任务)?

【问题讨论】:

    标签: android service android-asynctask intentservice


    【解决方案1】:

    首先,如果您的服务正在执行您希望在您的应用程序在前台运行时完成的事情,那么您不需要服务。您的活动或对话框可以只生成一个线程来执行您的任务,并且这些线程将在您的应用程序结束时结束,因为它们在您的应用程序的任务范围内。否则,对于您想要一直完成的任务,当用户可以在设备上做任何事情时,一定要使用服务。

    我不确定为什么“回电”不适合您?我假设您的意思是检查条件,如果满足条件则退出循环或阻塞。这通常是线程(在服务或其他地方)应该如何结束(尽管还有其他approaches)。您的服务线程可以侦听已发生的特定事件(例如,如果活动已被破坏,则在调用活动的onDestroy 时在文件或数据库中设置属性,但如果这是您想要的,那么您可能应该不使用服务),然后run() 可以优雅地返回。

    但是,如果这是一项无论用户在其设备上(在您的应用程序内部或外部)做什么,您都希望完成的任务,那么它应该是一个不应被外部中断的任务。它应该一直持续到完成为止。

    也许您可以更好地定义您希望何时停止此服务?

    【讨论】:

    • 我只希望 IntentService 在调用它的活动被破坏时停止。如果创建 IntentService 的活动被暂停(当前是这样),则 IntentService 应该继续执行。当 Activity 被销毁时在服务上调用 stopSelf() 确实会调用服务的 onDestroy 方法,但 onHandleIntent 会继续执行,它永远不会停止。
    • 如果您希望在活动被破坏时停止任务,那么我不会使用服务。我会使用一个线程来执行您的 onHandleIntent 方法中的代码。您可以手动终止线程,或者(我建议)您可以在活动的 onDestroy 调用中侦听条件集。通常我有一个名为“isLive”的静态布尔值,我在 onCreate 中将其设置为 true,在 onDestroy 中设置为 false,它通常用于此目的。
    • 亲爱的,谢谢这正是我正在寻找的答案!
    【解决方案2】:

    在您的 onDestroy() 方法中停止它

    【讨论】:

    • 怎么样? onDestroy() 被调用,但是如何从 onDestroy() 中停止 onHandleIntent() 方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多