2015-12-23 41 views
1

我正在使用AltBeacon信標掃描庫來掃描信標。我在服務中啓動信標掃描器,在啓動時或藍牙狀態發生變化時由廣播接收器調用。當我打開應用程序並再次退出時,BeaconHandler被殺死並重新啓動,因爲信標服務再次調用廣播接收器。AltBeacon在應用程序關閉時繼續掃描

問題是我不希望信標掃描儀在退出我的應用程序時被重置,因爲我將所有掃描的信標保存在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

如果內存不足,則無法阻止應用程序被用戶或操作系統殺死。

解決方案是將您的應用程序狀態保存在非易失性存儲中,然後在服務啓動時將其讀回。如果你的數據很簡單,那麼SharedPreferences是一個很好的存儲機制。

請記住,您無法控制應用程序何時死亡,或者在發生情況時依賴回調,因此您需要定期保存數據。

+0

嗨,是的,我知道我無法阻止應用程序在內存不足時被殺死。我已經想過使用共享首選項,但是列表中有很多條目要保存,如果這樣做會生效,它會佔用大量空間或花費很長時間來編寫和讀取所有數據back – qwertz

+0

如果用戶點擊後退按鈕關閉,你是說你不關心應用程序是否被OS關閉或關閉,你只希望服務繼續運行,而不是在手動重新啓動時重新啓動? – davidgyoung

+0

正好當用戶退出應用程序並在tge最近應用程序列表中關閉它時 – qwertz

相關問題