【问题标题】:Delay service action until network connection is available延迟服务操作,直到网络连接可用
【发布时间】:2011-09-11 04:33:49
【问题描述】:

在我的应用程序中,我想提供一个动作,该动作应定期在后台执行。所以我使用了AlarmManager,它启动了一个IntentService。

棘手的部分是,此后台操作需要 Internet 连接。因此,当设备被锁定时,我尝试使用似乎没有强制连接的 WakeLock。

然后我考虑注册一个 BroadcastReceiver 以在服务启动时侦听“android.net.conn.CONNECTIVITY_CHANGE”,并在收到所需的广播后立即取消注册。

我的代码如下所示:

public class BackgroundService extends IntentService {
    private static final IntentFilter filter =
        new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    private static NetworkStateChangedReceiver receiver =
        new NetworkStateChangedReceiver();

    protected void onHandleIntent(Intent intent) {
        registerReceiver(receiver, filter);
    }
}

我现在的问题是:一旦服务停止,这个接收器会被销毁吗(因为它什么都不做,只要没有可用的连接)? 因此,我怎样才能实现一项服务,它会延迟它的工作,直到网络连接可用?

谢谢。

【问题讨论】:

    标签: android service


    【解决方案1】:

    一旦服务停止,这个接收器是否会被销毁(因为它无事可做,只要没有可用的连接)?

    是的。它将存活几微秒。

    因此,我怎样才能实现一项服务,它会延迟它的工作,直到网络连接可用?

    使用ConnectivityManagergetActiveNetworkInfo(),看看有没有连接,如果没有,就退出onHandleIntent(),等待下一个告警。

    或者,在清单中注册您的 CONNECTIVITY_ACTION 接收器,并使用它来安排和取消您的警报,因此警报仅在有连接时才处于活动状态。

    还有各种其他策略,但这两个应该可以为您提供一个起点。

    【讨论】:

    • 所以我能做的最好的事情是一遍又一遍地启动任务,直到建立连接?
    • @cypressious:这是一种方法。我概述了两个,其中一个不符合该描述。
    • 我明白了。您的第二个建议是注册一个永久广播接收器。就我而言,该任务应每天执行 1-2 次。每 5 分钟处理一次广播,忽略其中的 95%,这不是不好的风格吗?
    • @cypressious:“每 5 分钟处理一次广播是不是很糟糕”——而你证明 CONNECTIVITY_ACTION 每 5 分钟发生一次的证据是,究竟是什么? “在我的情况下,该任务应每天执行 1-2 次” - 当然,您决定在您的问题中不提及。在这种情况下,当警报事件发生时,如果没有连接,我会使用PackageManager 启用CONNECTIVITY_ACTION manifest-registered 接收器。如果出现CONNECTIVITY_ACTION 并且您现在可以连接,请执行此操作并禁用CONNECTIVITY_ACTION 接收器。
    • "你证明 CONNECTIVITY_ACTION 每 5 分钟发生一次的证明是,究竟是什么?"好吧,这当然是猜测,但我假设连接经常断开,例如用于在锁定状态下省电。无论如何,我很抱歉没有提到任务的预期频率,你的建议听起来很有趣。我猜你在stackoverflow.com/questions/5624470/… 的回答是正确的方法?
    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2011-03-25
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多