【问题标题】:Android wait for network availableAndroid等待网络可用
【发布时间】:2012-06-05 10:33:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 当然,如果服务每15分钟执行一次,那么如果它要么确定没有连接,要么没有及时得到响应,你的服务应该进入休眠状态等待接下来的 15 分钟叫醒电话。
  • 你为什么选择不使用AlarmManager或BroadcastReciever?

标签: android web-services networking


【解决方案1】:

当手机进入待机状态时,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。

-------------- 更新 -------- -----

首先,在你的清单中声明你的广播接收器:

<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)。

【讨论】:

  • +1 非常重要的是,该服务不是让手机保持比它必须的更活跃的电池。
  • 好的,但我从不使用警报管理器和广播接收器,请您发布一个示例?但是如果手机处于待机状态,警报管理器和广播接收器可以工作吗?我写了一个错误,我必须每两小时而不是 15 分钟执行一次服务。
  • 更新了响应。 2 小时而不是 15 分钟,不同之处在于您将安排下一个 AlarmManager 之后的时间。
【解决方案2】:

在执行服务之前检查连接是否可用。下面提到的代码 sn -p 将帮助您识别是否有任何有效的网络连接。

    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 秒左右后轮询网络连接。

【讨论】:

  • 好的,但我从不使用警报管理器和广播接收器,请您发布一个示例?但是如果手机处于待机状态,警报管理器和广播接收器可以工作吗?我写了一个错误,我必须每两小时而不是 15 分钟执行一次服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2013-10-22
  • 2018-07-31
  • 2019-07-07
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多