Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android—跨多个活动管理本地服务绑定/解除绑定的有效方法_Android_Service_Bind_Unbind - Fatal编程技术网

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

Android—跨多个活动管理本地服务绑定/解除绑定的有效方法,android,service,bind,unbind,Android,Service,Bind,Unbind,从API 4级及以上级别确定目标和构建 现在,我正在处理一个问题,在这个问题中,我试图跨多个活动维护与本地服务的绑定,并在最后一个连接解除绑定时停止服务 简而言之,我的服务只是调用HandlerThread中的一个系统服务,该服务会快速返回到BroadcastReceiver,然后在等待预定的时间量(至少15秒)后再次执行相同的调用 假设我让我的基本活动以这种方式在onCreate()中创建与我的服务的第一个绑定: Intent service = new Intent(ActivityA.th

从API 4级及以上级别确定目标和构建

现在,我正在处理一个问题,在这个问题中,我试图跨多个活动维护与本地服务的绑定,并在最后一个连接解除绑定时停止服务

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

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

Intent service = new Intent(ActivityA.this, MyLocalService.class);
getApplicationContext().bindService(service, mConnection, BIND_AUTO_CREATE);
此外,假设由于我通过携带活页夹和连接来保持屏幕旋转时的绑定,在活动完成之前,我不会从服务中解除绑定: //OnRetainOnConfiguration实例继承了我的绑定器和连接,因为我是从应用程序上下文绑定的,所以它们是公平的

public void onDestroy(){
   super.onDestroy();
   //using binder, remove callback to service from current activity
   if(isFinishing(){
      getApplicationContext().unbindService(mConnection);
   }
}
我几乎为任何其他想要监听服务的活动都做了这个设置


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

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


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

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

当onDestroy()中的isFinishing()解析为true时,我最终解除了绑定,并通过OnRetainOnConfiguration实例()传递了绑定,因此,服务能够在最后一次解除绑定时关闭