2017-01-23 4 views
-1

배경 서비스에서 google fit API를 호출하려고하는데 최근 앱을 정리하면 서비스가 중지됩니다. 어쩌면 알람을 사용하면 서비스를 멈추지 않는 가장 좋은 방법이지만 오류가 로그에 남지 않고 충돌 할 수 있습니다. 이 작업을 수행하는 가장 좋은 방법입니까? 그렇지 않은 경우 가장 좋은 방법은 무엇입니까? 서비스에서 확장 무엇google에 맞는 api 백그라운드 서비스 호출

클래스 :

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; 
    } 
} 

답변

0

당신은 서비스가 항상 백그라운드 스레드에서 실행 여기에 AsyncTask를를 사용할 필요가 없습니다. doInBackground 메소드의 모든 코드를 수신 메소드로 이동하십시오.

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); 
} 

} 
+0

답변에 대한 탁구, 나는 이것이 정말로 효과가 있는지 모르겠지만, IntentService를 사용하여 문제를 해결할 수 있습니다. 어쨌든 고마워! – zasaz