应用关闭后,AltBeacon会继续扫描

时间:2015-12-23 19:33:48

标签: java android arraylist bluetooth ibeacon

我正在使用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));
        }
    }
}

如您所见,信标处理程序是一个单例类,因此当时只运行一个实例。是否有办法阻止信标扫描程序重置并在应用程序关闭时清除ArrayList

1 个答案:

答案 0 :(得分:0)

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

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

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