2017-01-23 11 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

Thaksこれが動作する場合、私は本当にしかし、私はIntentServiceを使用して、問題を解決することができ、知りません。とにかくありがとう! – zasaz

関連する問題