2016-01-11 81 views
3

我使用一項服務,在這項服務中,我有一個計時器,它會將每分鐘的消息發送到我的TCP/IP服務器。Android:屏幕鎖定時服務停止,爲什麼?

public void keepAlive() { 
     timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       try { 
        Gson gson = new Gson(); 
        String message = gson.toJson(new StillAlive(Mode.STILLALIVE)); 
        sendMessage(message); 
        Log.d("TCP-SEND", message); 
       } catch(Exception e) { 
        Log.e("TCP1", e.getMessage()); 
       } 
      } 
     }, 60000, 60000); 
    } 

但是當我的手機鎖。或者我按下按鈕關閉顯示屏,我的服務停止發送這些消息。

我不確定的是,如果停止服務,關閉顯示屏或者由於任何原因我不知道計時器停止。

有沒有人知道如果計時器在這種情況下停止?或者服務停止?

希望得到一些幫助! :-)

+0

這是無線/移動數據被關閉以節省電池。在移動設備上,不是消耗電池的數據量,這實際上是天線開機的時間量。如果您確實需要每分鐘檢查一次服務器上的內容,請改用Google Cloud Messaging。 Google雲消息傳遞不會增加電池使用量,但如果您使用技術假定您使其工作至少會消耗總電池使用時間的20%(即使未檢測到更改)。對大多數人來說,20%是很多的,特別是對於一個應用程序。請使用Google Cloud Messagi –

+0

@StephanBranczyk:我的問題是,我需要發送這些消息來告訴我的TCP服務器,連接仍在。我也可以每隔5分鐘發送一次,或者類似的東西,如果這可行的話。但是我需要在已知的時間範圍內發送消息。這可能嗎? – progNewbie

+0

@StephanBranczyk我不知道如何WhatsApp /電報等處理這個問題。他們是否使用谷歌雲消息傳遞? – progNewbie

回答

2

這是因爲您的設備開始睡眠。這是強烈建議使用這種方法的其它實現:AlarmManager

它看起來是這樣的(這是我的代碼的一部分):

private static AlarmManager am; 

//.... 
@SuppressLint("NewApi") 
public static void startByAlarm(Context ctx, boolean wakeup, long nexttime, boolean autoStart) 
    { 
PendingIntent pi = wakeup? PendingIntent.getBroadcast(ctx, _.intentalarm, intent, PendingIntent.FLAG_CANCEL_CURRENT): 
      PendingIntent.getService(ctx, _.intentalarm, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE); 
int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= android.os.Build.VERSION_CODES.KITKAT){ 
     am.setExact(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); 
    } else{ 
     am.set(wakeup?AlarmManager.RTC_WAKEUP:AlarmManager.RTC, nexttime, pi); 
    } 
//or am.setRepeating ... 
} 
+0

感謝您的快速回答:所以這意味着,這是一個計時器問題?:-) – progNewbie

+0

@progNewbie,我發現很多手機對於長期過程都有不同的表現。是的,你可以說,這是一個計時器問題。但核心問題是'電池壽命消耗'。如果您想以100%的概率ping您的服務器,您必須向您報警管理器。此外,我不知道你的代碼是否使用timer.stop()是你的代碼的一部分:) – Vyacheslav

+0

謝謝,我會測試這是否解決了我的問題。 :-) – progNewbie

0

看一看This answer by jscharf這可能是有益的但你必須警惕這一點,因爲這是一項耗電任務。

相關問題