2012-06-02 23 views
1

我有一个与LongPoll一起工作的服务,当我收到我的数据时,一切正常,但是当我没有收到数据,而是我收到空结果长时间轮询最大时间== 25秒)我的服务有时会手动关闭(我没有在服务列表中看到它)。Android服务在功能工作时间超过(约)15秒时关闭

那么,如何保持此服务(..always ..)运行?

递归函数,这与长轮询并在服务的onCreate()(结构)首先调用工作:

//"u" is "new utils()". 
public class myservice extends Service { 
    public static boolean started=false; 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    Toast.makeText(this, "created qweqwe", Toast.LENGTH_LONG).show(); 
    longpoll(); 
    this.started=true; 
    } 
    @Override 
    public void onDestroy() { 
    super.onDestroy(); 
    this.started=false; 
    } 
    private String url = "http://example.com/lp.php"; 
    private void longpoll() { 
    try { 
     String resp = u.getData(url); //max time of working u.getData(lpurl) - 25s. 
     if (resp.length()>0) doSmthWithData(resp); //It works fine 
    } catch(Exception e) {} 
    longpoll(); 
    } 
} 

回答

2

那么,如何保持这种服务(..always ..)运行?

从策略上看,根据问题标题中的“15秒”,我猜测您正在主要应用程序线程上进行长轮询。你需要在后台线程上完成。

从战略上讲,您无法保持“始终运行”的服务。您可以使用startForeground()来降低您的服务被自动销毁的几率,但用户和操作系统仍然可以随时出于任何原因清除您的流程(及其服务)。许多用户不喜欢因为浪费资源而“始终在运行”的服务,因此会在Play商店中以任务杀手和低评级攻击此类服务的开发人员。

+0

我已经更新了代码。如果(!myservice.started)它从主要活动开始。不是服务的后台线程? –

+1

@anony_root:“服务不是后台线程吗?” - 不它不是。从用户界面的角度来看,服务是在后台。它们不在主应用程序线程的后台。 'onStartCommand()'和一个服务的所有其他生命周期方法在主应用程序线程上调用 - 这是为您的UI提供动力的相同主应用程序线程。而且,也适用相同的规则:每一毫秒你绑定该线程冻结用户界面,并且如果你在该线程上花费很长时间,你将被终止。 – CommonsWare

+0

最后一件事:我可以从后台线程创建通知吗? –