2012-06-05 104 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