Позвоните в Google Fit API фоновый сервис

Я пытаюсь вызвать Google Fit API в фоновом режиме, но когда я очищаю последние приложения, служба останавливается. Возможно, использование будильника - лучший способ остановить службу, но она аварийно завершается, не оставляя ошибки в журнале. Это лучший способ сделать это? Если нет, то какой путь лучше?

Класс, который распространяется от Service:

public class ServiceGFA extends Service {

    Alarm alarm = new Alarm();

    public void onCreate(){
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        alarm.setAlarm(this);
        return START_STICKY;
    }

    @Override
    public void onStart(Intent intent, int startId){
        alarm.setAlarm(this);
    }

    @Override
    public IBinder onBind(Intent intent){
        return null;
    }

}

Класс тревоги:

public class Alarm extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    scs.execute();
}

public void setAlarm(Context context){
    scs = new stepscountservice();
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context,0,i,0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000*6*1, pi);
    Toast.makeText(context, "service started", Toast.LENGTH_SHORT).show();
}

public void cacelAlarm(Context context){
    Intent intent = new Intent(context, Alarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context,0,intent,0);
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}

private class stepscountservice extends AsyncTask<Object, Object, Long> {

    boolean cent;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        cent = true;
    }

    @Override
    public Long doInBackground(Object... params) {
        while (cent) {
            long total = 0;
            com.google.android.gms.common.api.PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(mApiClient, DataType.TYPE_STEP_COUNT_DELTA);
            DailyTotalResult totalResult = result.await(1, TimeUnit.SECONDS);
            if (totalResult.getStatus().isSuccess()) {
                DataSet totalSet = totalResult.getTotal();
                if (totalSet != null) {
                    total = totalSet.isEmpty() ? 0 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
                    pasos = total;
                }
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Object... values) {
        super.onProgressUpdate(values);
        Toast.makeText(context, "Steps:" + ""+values[0], Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        cent = false;
    }
}

1 ответ

Вам не нужно использовать AsyncTask, так как служба всегда работает в фоновом потоке. Просто переместите весь код из вашего метода doInBackground в метод onReceive.

public class UpdateFitnessData extends Service {

    private static final String TAG = "Service : FitnessData";

    private final int TIME_DELAY_15_MINUTES = 900000;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand: ");
    begin();
    setAlarm();
    return Service.START_STICKY;
}

private void begin() {
    Log.d(TAG, "begin: ");
    //Put your doInBackground Code here

}


private void setAlarm() {
    Intent intent = new Intent(this, UpdateFitnessData.class);

    PendingIntent pendingIntent = PendingIntent.getService(this , 0, intent, PendingIntent.FLAG_ONE_SHOT);

    //Following code will restart your application after 2 seconds
    AlarmManager mgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    mgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + TIME_DELAY_15_MINUTES, pendingIntent);
}

}
Другие вопросы по тегам