Java AltBeacon在应用程序关闭时保持扫描

Java AltBeacon在应用程序关闭时保持扫描,java,android,arraylist,bluetooth,ibeacon,Java,Android,Arraylist,Bluetooth,Ibeacon,我正在使用AltBeacon信标扫描库扫描信标。我在一个服务中启动信标扫描器,它在启动时或蓝牙状态改变时被广播接收器调用。当我打开应用程序并再次退出时,BeaconHandler被终止并重新启动,因为信标服务再次调用广播接收器 问题是我不想在退出应用程序时重置信标扫描器,因为我将所有扫描的信标保存在ArrayList中,并且需要跟踪用户在建筑物中的移动。因此,当我退出应用程序时,我的Arraylist将被清除,我将无法跟踪用户的移动 我的后台服务: public class BeaconServ

我正在使用
AltBeacon
信标扫描库扫描信标。我在一个服务中启动信标扫描器,它在启动时或蓝牙状态改变时被广播接收器调用。当我打开应用程序并再次退出时,
BeaconHandler
被终止并重新启动,因为信标服务再次调用广播接收器

问题是我不想在退出应用程序时重置信标扫描器,因为我将所有扫描的信标保存在
ArrayLis
t中,并且需要跟踪用户在建筑物中的移动。因此,当我退出应用程序时,我的
Arraylist
将被清除,我将无法跟踪用户的移动

我的后台服务:

public class BeaconService extends Service {
    private static final String TAG = "BeaconService";

    private BeaconHandler beaconHandler;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Log.e(TAG, "onCreate()");
    }

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

        beaconHandler = BeaconHandler.getInstance(getApplicationContext(),
                BeaconHandler1.getInstance(getApplicationContext()),
                BeaconHandler2.getInstance(getApplicationContext()));

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.e(TAG, "onDestroy()");

        beaconHandler.stopListening();

        sendBroadcast(new Intent(this, BluetoothReceiver.class));
    }
}
我的广播接收器:

public class BluetoothReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("BluetoothReceiver", "onReceive()");

        if (BeaconManager.getInstanceForApplication(context).checkAvailability()) {
            context.startService(new Intent(context, BeaconService.class));
        } else {
            context.stopService(new Intent(context, BeaconService.class));
        }
    }
}

如您所见,beacon处理程序是一个单例类,因此当时只有一个实例在运行。当应用程序关闭时,是否有方法防止信标扫描仪复位并清除my
ArrayList

如果内存不足,您无法阻止用户或操作系统杀死应用程序

解决方案是将应用程序状态保存在非易失性存储器中,然后在服务启动时将其读回。如果您的数据很简单,这是一种很好的存储机制


请记住,你无法控制你的应用程序何时被终止,或者在它发生时依赖回调,因此你需要定期保存数据

如果内存不足,您无法阻止应用程序被用户或操作系统杀死

解决方案是将应用程序状态保存在非易失性存储器中,然后在服务启动时将其读回。如果您的数据很简单,这是一种很好的存储机制


请记住,你无法控制你的应用程序何时被终止,或者在它发生时依赖回调,因此你需要定期保存数据

嗨,是的,我知道当应用程序内存不足时,我无法阻止它死掉。我已经考虑过使用共享首选项,但是列表中有很多条目需要保存,idk如果这样做会不会成功,因为它会占用很多空间,或者需要很长时间来写入和读取所有数据,你是说你不在乎你的应用程序是被操作系统强制关闭还是关闭,如果用户点击“上一步”按钮关闭,您只想让服务继续运行,而不是在手动重新启动时重新启动?就在用户退出应用并在tge recents应用程序列表中关闭应用程序时,问题在于,从任务列表中关闭应用程序会杀死所有正在运行的服务,就像它因内存不足而关闭一样。这就给你留下了我提供的答案。如果SysPoad不工作,您可能会考虑SQLite数据库,甚至考虑具有序列化java对象的平面文件。但是你需要非易失性存储来解决这个问题。嗨,是的,我知道我无法阻止应用程序在内存不足时被杀死。我已经考虑过使用共享首选项,但是列表中有很多条目需要保存,idk如果这样做会不会成功,因为它会占用很多空间,或者需要很长时间来写入和读取所有数据,你是说你不在乎你的应用程序是被操作系统强制关闭还是关闭,如果用户点击“上一步”按钮关闭,您只想让服务继续运行,而不是在手动重新启动时重新启动?就在用户退出应用并在tge recents应用程序列表中关闭应用程序时,问题在于,从任务列表中关闭应用程序会杀死所有正在运行的服务,就像它因内存不足而关闭一样。这就给你留下了我提供的答案。如果SysPoad不工作,您可能会考虑SQLite数据库,甚至考虑具有序列化java对象的平面文件。但你需要非易失性存储来解决这个问题。