2011-12-28 66 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