Android - 跨多个活动管理本地服务绑定/解除绑定的有效方法

时间:2011-05-06 01:36:22

标签: android service bind unbind

从API级别4及以上版本进行定位和构建。

现在,我正在处理一个问题,我试图在多个活动中保持与本地服务的绑定,并在最后一个连接未绑定时停止服务。

简而言之,我的服务只是调用HandlerThread中的系统服务,该服务快速返回到BroadcastReceiver,然后在等待预定的时间(至少15秒)后再次执行相同的调用。

假设我的基本活动以这种方式在onCreate()中为我的服务创建第一个绑定:

Intent service = new Intent(ActivityA.this, MyLocalService.class);
getApplicationContext().bindService(service, mConnection, BIND_AUTO_CREATE);

假设由于我通过携带绑定器和连接来保持屏幕旋转的绑定这一事实,我不会在活动结束之前解除绑定:     // onRetainNonConfigurationInstance继承我的活页夹和连接,因为我从应用程序上下文绑定,所以它们是公平的游戏。

public void onDestroy(){
   super.onDestroy();
   //using binder, remove callback to service from current activity
   if(isFinishing(){
      getApplicationContext().unbindService(mConnection);
   }
}

我几乎为其他想要收听服务的活动做了这个设置。

我的问题是,最终,某些活动不会立即取消绑定,因此如果服务是自动创建的,则服务仍将按照绑定/取消绑定模式的行为挂起。在解除对最后一个活动的绑定之前,我不得不停止我的线程,这阻止了在BG中调用任何系统服务。是否有更好的方法来管理绑定和解除绑定的服务,或者我是否正在使用当前的设置?此外,由于我的服务(通过活页夹)被弱引用,这是否会降低我泄漏内存的风险?

1 个答案:

答案 0 :(得分:1)

显然,由于我没有通过旋转传递绑定并且我使用内部状态标志来确定活动是否正在旋转(在onRetainNonConfigurationInstance时设置为true),因此它不会取消注册() 被称为)。在大多数情况下,它没有在onDestroy()中正确读取状态。

当onFinishing()在onDestroy()中解析为true并且通过onRetainNonConfigurationInstance()传递绑定时,我最终取消绑定,结果,服务能够在最后一次取消绑定时关闭。