2016-01-11 80 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这可能是有益的但你必须警惕这一点,因为这是一项耗电任务。

相关问题