2012-08-25 42 views
4

我正在爲一個互聯網討論板構建一個Android客戶端:應用程序從服務器下載討論並使用原生Android UI顯示它們。構建基礎知識(例如獲取和顯示內容)並將回覆發佈回服務器非常簡單。保持離線數據與沒有GCM的服務器同步的節能方式是什麼?

現在我想將其帶到一個新的水平:應用程序應在本地存儲所有數據的設備和同步它在服務器上定期,獲取最新變化和更新本地數據庫。我不希望它檢查需求的變化;定期更新更好,因爲這允許訂閱更新等一些不錯的功能。

不幸的是,服務器不GCM兼容(它永遠不會),這是一個很好的老簡單的web服務器,所以我要實現同步自己。

我發現a comment to another question它說,基於定時器的檢查是一個壞主意,因爲設備必須喚醒並連接到Internet。當設備開始自己的數據同步時抓住它會更好,但是它有一種方法可以在沒有臨時檢查的情況下處理這個問題?

我看了很多關於這個問題的討論;他們大多討論ContentProviders,協議,像GCM/C2DM等服務。我沒有發現任何關於電源效率的信息。

那麼如何正確地進行同步,以便我的應用程序不會耗盡電池?

+0

如果您使用現在稱爲GCM的c2dm,因爲服務器可以推送更新(如果可用的話會比查詢更節能),那會更好:) –

+0

GCM非常棒,但它需要服務器完成一些工作。在我的情況下,這幾乎是不可能的(我已經有服務器,我不能使其符合GcM標準)。我會更新原始帖子以標記此。 –

回答

2

如果您使用GCM作爲服務器可以把如果可用,這將是力比輪詢高效的網絡,纔會有更新可用時它比及時輪詢好得多使用更新,因爲它會檢查並喚醒它會更好手機只是爲了檢查更新

重要:C2DM已正式棄用2012年6月26日,這意味着C2DM已停止接受新用戶和配額的請求。沒有新的功能將被添加到C2DM。但是,使用C2DM的應用程序將繼續工作。我們鼓勵現有的C2DM開發人員遷移到稱爲Google Cloud Messaging for Android(GCM)的新版C2DM。有關更多信息,請參閱C2DM-GCM遷移文檔。開發人員必須使用GCM進行新的開發。

但你不能用GCM讓你不得不去投票本身可以通過使用警報管理器使用能夠在電源efficiant方式,和不重複

我認爲這是輪詢最佳的電源效率的方式定期

給人一種示例代碼

public class MyScheduleReceiver extends BroadcastReceiver { 

    // Restart service every 30 sec 
    private static final long REPEAT_TIME = 1000 * 30 ; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     AlarmManager service = (AlarmManager) context 
      .getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, MyStartServiceReceiver.class); 
     PendingIntent pending = PendingIntent.getBroadcast(context, 0, i, 
      PendingIntent.FLAG_CANCEL_CURRENT); 
     Calendar cal = Calendar.getInstance(); 
     // Start 30 seconds after boot completed 
     cal.add(Calendar.SECOND, 30); 
     // 
     // Fetch every 30 seconds 
     // InexactRepeating allows Android to optimize the energy consumption 
     service.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      cal.getTimeInMillis(), REPEAT_TIME, pending); 

     // service.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 
     // REPEAT_TIME, pending); 
    } 
} 

(有一個more detailed explanation that includes the necessary manifest items

+0

感謝您的代碼;這看起來是一個答案,但我需要嘗試實現這一點。但是,通過RTC而不是RTC_WAKEUP會更節能嗎?我的服務會一直睡到設備由於某種其他原因而被喚醒(例如,某些其他同步將其喚醒)。 –

+0

這取決於你的使用,如果你使用rtc手機不會觸發警報(在上述代碼中的意圖,如果它的睡眠 –

+0

但它會在稍後由於某種其他原因而被喚醒時觸發它嗎?如果是的話,那很好。 –

0

你可以建立一個小服務器端應用程序將執行定期輪詢並利用GCM通知Android客戶端進行任何更新。

ofcourse,您有其他問題,如需要查詢爲用戶的每一個。

0

一個好主意,將與GCM,但正如你所說,這是不可能給你的。在這種情況下,這是我推薦的:

  1. 如果可能,通過WiFi更新。這樣您可以更快地完成數據傳輸,從而減少設備無線電活動所需的時間。
  2. 羣集轉移在一起。不要傳輸1個文件,然後等待一段時間再做一次傳輸。相反,轉移到另一個之後。這減少了無線電需要活動的時間,因此節省了電池壽命。
  3. 充電時更新,並更新更多。如果設備正在充電,則可以保持網絡連接更長時間而不會導致電池電量耗盡。因此,您可以在充電時同步3天的數據而不是24小時的數據,並且在用戶需要2天的數據時可以節省電池,以避免正常同步數據。

您還可以觀看this來自IO 2012的會話,瞭解使用網絡時的效率。

相關問題