Позвоните в 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);
}
}