Android 为什么远程服务会丢失对对象的引用,而对象包含对服务的引用?

Android 为什么远程服务会丢失对对象的引用,而对象包含对服务的引用?,android,service,process,ibeacon-android,Android,Service,Process,Ibeacon Android,在我的例子中,我确实与来自远程进程服务的服务通信。。。在主应用程序中,我在清单中声明了两个服务: <service android:name="com.estimote.sdk.service.BeaconService"/> <service android:process="my_remote_process" android:name="com.example.ServiceClass"/> 在ServiceClass.java中,我声明 protected Be

在我的例子中,我确实与来自远程进程服务的服务通信。。。在主应用程序中,我在清单中声明了两个服务:

<service android:name="com.estimote.sdk.service.BeaconService"/>
<service android:process="my_remote_process" android:name="com.example.ServiceClass"/>
在ServiceClass.java中,我声明

protected BeaconManager beaconManager;
作为类作用域中的全局变量和onCreate方法中的I instanceate对象:

super.onCreate();
beaconManager = new BeaconManager(this);
我还有一个本地自定义类,叫做public类ManageConnections 它使用beaconManager建立连接、扫描区域等

beaconManager持有对BeacConservice的引用,这是我在清单中声明的

现在的问题是:

如果我通过Home按钮关闭应用程序,BearScience将继续扫描。如果我确实完全关闭了应用程序,请按住Home按钮并将activity away调换,服务将重新启动,因为ServiceClass返回START\u STICKY,BearConservice将继续扫描。但如果我通过返回按钮关闭应用程序,10-20分钟后,有时甚至是立即关闭,我的变量beaconManager(在ServiceClass类范围中声明)将丢失对beaconManager实例的引用,并导致beaconManager扫描崩溃


我错过了什么?我是否误解了处理、线程和服务,还是垃圾收集器破坏了实例?我想说,完全关闭应用程序比仅仅通过返回按钮关闭应用程序更糟糕,但行为告诉我一些不同的情况。

检查ServiceClass是否已在运行,以避免在设备上复制ServiceClass: 无需执行此操作,如果您尝试启动服务并已在运行,则设备中只能运行一个服务实例。此方法将被调用:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand");
    super.onStartCommand(intent, flags, startId);

    return START_STICKY;// Restart if killed because of poor resource
}
在ServiceClass类范围中声明的变量beaconManager失去了对beaconManager实例的引用,并导致beaconManager扫描崩溃

发生这种情况是因为活动和服务不共享相同的上下文,每个活动都有自己的上下文,并且一旦应用程序从队列de OS release it引用中删除,就会立即释放它。如果您希望再次从服务调用活动,请使用putExtra将应用程序包和类作为字符串发送到服务,并在onStart命令中接收额外的内容

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand");
    super.onStartCommand(intent, flags, startId);

    return START_STICKY;// Restart if killed because of poor resource
}