2011-12-28 76 views
0

在我開發的應用程序中有一個綁定服務,它使用TCP套接字連接。對服務的要求是在綁定到服務的最後一個活動關閉之後保持套接字連接一段時間,比如說1分鐘。這是爲了避免在另一個活動連接到該服務後,不必要的套接字重新連接。綁定的服務和超時

我已經搜索並找到類似問題(Service, Rebind or not bound at all?)暗示使用啓動服務,但當前的應用程序體系結構使用綁定連接,並且如果不需要,我不想重新設計。因此我正在尋找其他選項。

我的問題是,我可以以某種方式推遲綁定服務銷燬或唯一的好方法是使用意圖重寫與服務的通信,從而將其轉換爲啓動服務?

public class SocketService extends Service { 

    private static final String LOG_TAG = SocketService.class.getSimpleName(); 

    @Override 
    public final IBinder onBind(final Intent intent) { 
     Log.d(LOG_TAG, "onBind()");  
     return new LocalBinder<SocketService>(this); 
    } 


    @Override 
    public boolean onUnbind(Intent intent) { 
     Log.d(LOG_TAG, "onUnbind"); 
     return super.onUnbind(intent); 
    } 

    @Override 
    public void onCreate() { 
     Log.d(LOG_TAG, "onCreate"); 

     // create socket connection here 
     // ... 
     // 

     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     Log.d(LOG_TAG, "onDestroy"); 
     // close socket connection 
     // ... 
     // 
     super.onDestroy(); 
    } 

    // Other socket sending and receiving logic 
    // ... 
    // 
} 

在此先感謝您的時間。

回答

0

保持啓動的第一個活動綁定到服務,不要在啓動另一個活動時將其銷燬。

當您想從當前活動中退出應用程序時,向服務發送一個信號,通知所有活動關閉。

OnCreate僅在服務的第一個綁定(當服務不存在時)上調用,後面的綁定不應該觸發onCreate函數。

+0

我認爲這不起作用,至少在我的情況下,AFAIK Android控件在活動被銷燬時。因此,用戶在我的活動中按下「返回」後,很有可能會調用Destroy。另一方面,我必須從服務中取消綁定Activity.onDestroy以避免連接泄漏。 – pkk 2011-12-28 15:56:48

+0

通過調用finish(),Android不控制何時銷燬活動(僅在極端情況下)。如果你沒有關閉舊活動,那麼當你啓動一個新活動時,你不會在服務中觸發第二個onCreate,並且當你決定銷燬你的活動或者android(因爲他需要內存...)的onDestroy函數活動將被調用並且最後一個被銷燬,它將關閉tcp連接並完成服務。 – Rick 2011-12-29 19:53:44

+0

我確實希望活動被關閉,因此完成,例如用戶按下「返回」鍵。在解除綁定之後,服務應該繼續活動一段時間... – pkk 2011-12-30 09:08:05