1

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

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

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

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

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

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

4

2 回答 2

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

于 2012-06-05T10:45:15.770 回答
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 中,您只需通过意图(使用意图中的参数启动服务)向您的服务发送消息,获取 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() 方法(在此处查看)。在与 AlarmManager 关联的 onReceive() 方法的所有执行过程中,Cpu 将保持开启状态。然后您需要锁定 cpu,启动现在确定执行的服务。同时 onReceive() 方法将停止,但您的服务可以确保正在执行。你唯一需要做的就是找到一个解决方法,让你的服务与你的 AlarmManager 通信,在服务执行后释放 cpu 锁,如 AlarmManager 的主页所述。也就是说,您只需要将服务与广播接收器同步,使用外部对象来保存所需的信息(在这种情况下,如果 cpu 在服务结束时锁定,则释放 cpu)。

于 2012-06-05T10:45:52.717 回答