Android等待网络可用

时间:2012-06-05 10:33:58

标签: android web-services networking

我正在写一个每15分钟执行一次的Android服务。

它需要互联网连接,因为它向服务器发送请求,如果服务器的响应是“ok”,则服务执行一些代码。

如果手机未处于待机状态(屏幕已开启),则一切正常,但如果手机处于待机模式,则连接不可用且服务无法正常工作。 我希望服务等待可用的连接,然后将请求发送到服务器。

例如,手机处于待机模式,15分钟后,服务启动,然后尝试将请求发送到服务器,但连接不可用。在这种情况下,我希望服务等待连接变为可用,然后将请求发送到服务器。

有人可以建议应该做些什么吗?

好的但是我从不使用闹钟管理器和广播接收器请你发一个例子吗?但是,如果手机处于待机状态,报警管理器和广播接收器是我写了一个错误,我必须每两个小时执行一次服务而不是15分钟。

2 个答案:

答案 0 :(得分:2)

在执行服务之前,检查连接是否可用。下面提到的代码段将帮助您确定是否存在任何有效的网络连接。

    ConnectivityManager connectivity = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivity != null) {
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
        if (info != null) {
            for (NetworkInfo networkInfo : info) {
                if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
    }
    return false;

如果没有连接,则暂停服务呼叫,然后在30秒左右后轮询网络连接。

答案 1 :(得分:2)

当手机进入待机状态时,cpu将停止工作,导致所有进程停止执行。 您可以通过使用PowerManager并锁定CPU来避免这种情况,以确保即使手机处于待机状态也能保持开启状态:

m_wakeLock = m_powerManager.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK, "My Tag");

m_wakeLock.acquire();
... cpu is assured to be on during this time ...
m_wakeLock.release();

但是,由于您需要每15分钟唤醒一次服务,即使在待机状态下,也可能导致电池使用频繁。 您可以使用AlarmManager来避免这种情况,它将每15分钟安排一次事件,然后启动相应的BroadcastReceiver。 在BroadcastReceiver中,您只需通过intent(在intent中启动带有参数的服务)发送消息,获取cpu,执行工作并释放cpu。

-------------------------- UPDATE -------------------- -----

首先,在清单中声明你的broadcastReceiver:

<receiver
        android:name="StartUpReceiver"
        <intent-filter>
             <action android:name="my.Package.MyEvent" />
             <category android:name="android.intent.category.HOME" />
         </intent-filter>
</receiver>

您的BroadcastReceiver看起来与此类似:

public class StartUpReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent();
        serviceIntent.setAction("my.Package.MyService");
        context.startService(serviceIntent);

    }

}

这样,每当使用例如sendBroadcast(Intent)方法(CHECK HERE)启动动作“my.Package.MyEvent”的意图时,你的广播接收器(即,只是一个类扩展BroadcastReceiver类CHECK HERE)将执行它的onReceive()方法。 在我的代码中,我只是使用适当的操作(“my.Package.MyService”)创建一个Intent,然后启动MyService。

AlarmManager类只是为您提供了一种方法来安排将来启动的一些意图,类似于sendBroadcast()方法(CHECK HERE)。 在执行与AlarmManager关联的onReceive()方法期间,Cpu将保持打开状态。然后你需要锁定cpu,启动现在确定要执行的服务。同时onReceive()方法将停止,但确保您的服务正在执行。 您需要做的唯一事情就是找到有关如何让您的服务与AlarmManager通信的解决方法,以及在执行服务后释放CPU锁定,如AlarmManager主页中所述。 也就是说,您只需要将您的服务与您的广播接收器同步,使用外部对象来保存所需的信息(在这种情况下,如果cpu在服务结束时被锁定,则释放cpu)。