【问题标题】:Android - effective way to manage binding/unbinding from local service across multiple activitiesAndroid - 跨多个活动管理与本地服务绑定/解除绑定的有效方法
【发布时间】:2011-05-16 23:27:43
【问题描述】:

从 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);
   }
}

我几乎为任何其他想要监听服务的 Activity 进行此设置。

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

【问题讨论】:

    标签: android service bind unbind


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多