2011-09-10 67 views
1

在我的应用程序,我想提供一个动作,这将在后台定期执行。所以我使用AlarmManager,它启动一个IntentService。延时服务动作,直到网络连接可用

棘手的部分是,这样的背景下行动需要互联网连接。所以我试着用一个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); 
    } 
} 

我的问题是现在:请问这个接收器被破坏,只要该服务停止(因为它没有任何关系,只要没有连接可用)? 因此,如何才能实现一项服务,延迟它的工作,直到网络连接可用?

谢谢。

回答

1

一旦服务停止,只要没有连接可用,这个接收器会被销毁吗?

是。它会活几微秒。

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

使用ConnectivityManagergetActiveNetworkInfo(),看看是否有一个连接,如果没有,只是退出onHandleIntent(),等待下一次报警。

或者,注册您的CONNECTIVITY_ACTION接收器的清单,并用它来安排和取消警报,所以警报才有效,而有一个连接。

还有其他各种策略,但是这两个应该给你一个起点。

+0

所以我能做的最好的,是遍地启动任务,直到建立连接? –

+0

@cypressious:这是一种方法。我概述了两个,其中一个不符合该描述。 – CommonsWare

+0

我明白了。你的第二个建议是注册一个永久的BroadcastReceiver。就我而言,任务应该每天执行1-2次。这是不是坏风格,每隔5分钟处理一次广播,忽略其中95%? –