繁体   English   中英

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

[英]Android - effective way to manage binding/unbinding from local service across multiple activities

从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中任何系统服务的调用。 有没有更好的方法来管理绑定和取消绑定服务,或者我在当前设置下会尽力吗? 另外,由于我的服务(通过活页夹)被弱引用,这是否会减少我泄漏内存的风险?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM