我正在使用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
?
答案 0 :(得分:0)
如果内存不足,您无法阻止应用程序被用户或操作系统杀死。
解决方案是将您的应用状态保存在非易失性存储中,然后在服务启动时将其读回。如果您的数据很简单,SharedPreferences是一个很好的存储机制。
请记住,您无法控制应用程序何时被杀,或者在发生时依赖回调,因此您需要定期保存数据。