Android等待网络可用

标签 android web-services networking

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

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

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

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

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

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

最佳答案

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

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

首先,在您的 list 中声明您的 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”的 Intent 时,您的广播接收器(即只是一个扩展BroadcastReceiver 类 CHECK HERE ) 将执行它的 onReceive() 方法。 在我的代码中,我只是创建一个带有适当操作的 Intent(“my.Package.MyService”),然后启动 MyService。

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

关于Android等待网络可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10895720/

相关文章:

c++ - 如何知道QUdpSocket中的发送端口号?

android - OnBindViewHolder 中选中的复选框在显示时未选中

android studio Gradle 同步失败 : Failed to find Build Tools revision 28. 0.2

wcf - 提高 WCF 性能

Android 与 WCF Web 服务使用 ksoap2 - 错误 SoapFault - 故障代码 : 'a:InternalServiceFault'

java.net.ConnectException : Connection refused

android - 如何防止有人盗用我的应用程序?

android - findViewById 使用处理程序类为自定义 ImageView 返回 null

java - 教程如何从现有 Java 代码创建 CXF Web 服务并将其嵌入到 Tomcat 中

docker-compose 解析 url 中的主机名