Распознавание активности не работает после того, как телефон засыпает

Отказ от ответственности: это не дубликатФункция распознавания активности перестает получать обновления, когда телефон переходит в режим ожидания (состояние выключенного экрана) потому что я уже использую этот подход, и это не помогает.

Проблема:

Кажется, что служба распознавания активности перестает работать и не отправляет никаких обновлений, когда устройство засыпает. Он работает нормально (распознанные действия сохраняются в sqlite), когда устройство не спит, но как только я нажимаю кнопку питания в HTC M8, с этого момента ничего не сохраняется, пока я не разбуду устройство, но снова нажму кнопку питания.

Некоторые детали того, как я делаю распознавание активности:

Запрос обновлений распознавания активности выглядит так (взято изофициальные образцы Google но я изменилсяIntentService вBroadcastReceiver):

public class DevActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    //...

    private PendingIntent getActivityDetectionPendingIntent() {
        Intent intent = new Intent(this, ActRecReceiver.class);
        return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
    }

    public void requestActivityUpdatesButtonHandler(View view) {
        if (!googleApiClient.isConnected()) {
            Toast.makeText(this, "not_connected", Toast.LENGTH_SHORT).show();
            return;
        }
        final Preferences pref = new Preferences(this);
        ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(
                googleApiClient,
                pref.getActRecInterval(0),
                getActivityDetectionPendingIntent()
        ).setResultCallback(this);
    }

}

Получение обновлений распознавания активности выглядит так (стандартноWakefulBroadcastReceiver + IntentService сотрудничество)

public class ActRecReceiver extends WakefulBroadcastReceiver {

    private static final String TAG = "ActRecReceiver";
    private static final boolean LOG = BuildConfig.LOGGING;

    @Override
    public void onReceive(Context context, Intent intent) {

        if (LOG) Log.d(TAG, "onReceive");
        Intent serviceStarter = new Intent(context, DetectedActivitiesIntentService.class);
        serviceStarter.putExtra("ActivityRecognitionResult", ActivityRecognitionResult.extractResult(intent));
        startWakefulService(context, serviceStarter);
    }
}

public class DetectedActivitiesIntentService extends IntentService {

    protected static final String TAG = "DetectedActivitiesIS";

    public DetectedActivitiesIntentService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ActivityRecognitionResult result = intent.getParcelableExtra("ActivityRecognitionResult");
        List<DetectedActivity> detectedActivities = result.getProbableActivities();
        HashMap<Integer, Integer> detectedActivitiesMap = new HashMap<>();
        for (DetectedActivity activity : detectedActivities) {
            detectedActivitiesMap.put(activity.getType(), activity.getConfidence());
        }

        storeEventToSqlite(detectedActivitiesMap);

        ActRecReceiver.completeWakefulIntent(intent);
    }
}

я используюcompile 'com.google.android.gms:play-services-location:8.1.0'

EDIT1:

После прочтения подсказок от пользователя bjiang и этого ответаhttps://stackoverflow.com/a/32965481/2401535 Похоже, что на устройствах HTC есть какая-то проблема, потому что она НЕ работает так, как в api docs распознавания активности:

Для экономии заряда аккумулятора отчеты об активности могут прекратиться, если устройство находится в состоянии «ЕЩЕ» в течение длительного периода времени. Он возобновится, как только устройство снова начнет двигаться. Это происходит только на устройствах, которые поддерживают оборудование Sensor.TYPE_SIGNIFICANT_MOTION.

HTC M8 действительно поддерживаетSensor.TYPE_SIGNIFICANT_MOTION поэтому распознавание активности должно начаться снова послеdevice moves again, Но это не так. Это действительно начинает распознавание активности после того, как я просыпаюсь устройство с кнопкой питания

Ответы на вопрос(0)

Ваш ответ на вопрос