2012-06-02 27 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

最後一件事:我可以從後臺線程創建通知嗎? –