2012-06-05 65 views
1

我正在编写一个每15分钟执行一次的Android服务。Android等待网络可用

它需要互联网连接,因为它发送一个请求到服务器,如果服务器的响应有点像“OK”的服务执行一些代码。

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

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

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

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

+0

当然,如果服务每15分钟执行一次,那么如果它确定没有连接或无法及时得到响应,那么您的服务应该进入休眠状态并等待下一个15分钟的唤醒打电话。 –

+0

你为什么选择不使用'AlarmManager'或'BroadcastReciever'? – gobernador

回答

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

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

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

你的广播接收器将目光类似于此:

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(意图)方法()启动具有动作“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结束时被锁定)。

+0

+1这项服务不是让电话更加活跃的电池,这一点非常重要。 –

+0

好吧,但我从来没有使用报警管理器和广播接收器请你发布一个例子吗?但是如果电话处于待机状态,报警管理器和广播接收器工作吗我写了写错误,我必须每两小时不要15分钟执行一次服务。 – user1437101

+0

更新后的响应。 2小时而不是15分钟,不同之处在于您将安排下一个AlarmManager。 –

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

+0

好吧,但我从来没有使用报警管理器和广播接收器请你发布一个例子吗?但是如果电话处于待机状态,报警管理器和广播接收器工作吗我写了写错误,我必须每两小时不要15分钟执行一次服务。 – user1437101