即使应用程序关闭或屏幕关闭,如何接收外部传感器数据?

时间:2015-11-13 07:30:07

标签: android bluetooth-lowenergy

即使应用关闭或屏幕关闭,我怎样才能收到外部传感器数据?

我目前正在使用此功能通过蓝牙低功耗收集数据:

public void onDataRecieved(BleSensor<?> sensor, String text) {

    if (sensor instanceof BleHeartRateSensor) {
        final BleSensor hSensor = (BleSensor) sensor;
        float[] values = hSensor.getData();

        //Start service to write data to a file


        viewText.setText(text);
    }

这是用于实现BLE传感器侦听器的类。这是一项活动。我在尝试将其转换为服务时遇到了麻烦。

public abstract class DemoSensorActivity extends Activity {
private final static String TAG = DemoSensorActivity.class.getSimpleName();

public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
public static final String EXTRAS_SENSOR_UUID = "SERVICE_UUID";

private BleService bleService;
private String serviceUuid;
private String deviceAddress;

// Handles various events fired by the Service.
// ACTION_GATT_CONNECTED: connected to a GATT server.
// ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
// ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
// ACTION_DATA_AVAILABLE: received data from the device.  This can be a result of read
//                        or notification operations.
private final BroadcastReceiver gattUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (BleService.ACTION_GATT_DISCONNECTED.equals(action)) {
            //TODO: show toast
            finish();
        } else if (BleService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
            final BleSensor<?> sensor = BleSensors.getSensor(serviceUuid);
            bleService.enableSensor(sensor, true);
        } else if (BleService.ACTION_DATA_AVAILABLE.equals(action)) {
            final BleSensor<?> sensor = BleSensors.getSensor(serviceUuid);
            final String text = intent.getStringExtra(BleService.EXTRA_TEXT);
            onDataRecieved(sensor, text);
        }
    }
};

// Code to manage Service lifecycle.
private final ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder service) {
        bleService = ((BleService.LocalBinder) service).getService();
        if (!bleService.initialize()) {
            Log.e(TAG, "Unable to initialize Bluetooth");
            finish();
        }
        // Automatically connects to the device upon successful start-up initialization.
        bleService.connect(deviceAddress);
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        bleService = null;
        //TODO: show toast
        finish();
    }
};

public abstract void onDataRecieved(BleSensor<?> sensor, String text);

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

    final Intent intent = getIntent();
    deviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
    serviceUuid = intent.getStringExtra(EXTRAS_SENSOR_UUID);

    getActionBar().setDisplayHomeAsUpEnabled(true);

    final Intent gattServiceIntent = new Intent(this, BleService.class);
    bindService(gattServiceIntent, serviceConnection, BIND_AUTO_CREATE);
}

@Override
protected void onResume() {
    super.onResume();

    registerReceiver(gattUpdateReceiver, makeGattUpdateIntentFilter());
    if (bleService != null) {
        final boolean result = bleService.connect(deviceAddress);
        Log.d(TAG, "Connect request result=" + result);
    }
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(gattUpdateReceiver);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindService(serviceConnection);
    bleService = null;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

private static IntentFilter makeGattUpdateIntentFilter() {
    final IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(BleService.ACTION_GATT_SERVICES_DISCOVERED);
    intentFilter.addAction(BleService.ACTION_GATT_DISCONNECTED);
    intentFilter.addAction(BleService.ACTION_DATA_AVAILABLE);
    return intentFilter;
}

}

目前只有在应用程序处于打开状态且屏幕已打开时才会运行此选项。当应用程序关闭且屏幕关闭时,有没有办法继续运行此数据收集?

0 个答案:

没有答案