package com.android_mvc.sample_project.bat; import com.android_mvc.framework.bat.BasePeriodicService; import com.android_mvc.framework.gps.GetMyLocationEventTask; import com.android_mvc.framework.gps.LocationUtil; import com.android_mvc.framework.task.AsyncTasksRunner; import com.android_mvc.framework.task.ISequentialRunnable; import com.android_mvc.framework.task.RunnerFollower; import com.android_mvc.framework.task.SequentialAsyncTask; import com.android_mvc.sample_project.common.Util; import com.android_mvc.sample_project.db.dao.LocationLogDAO; import com.android_mvc.framework.ui.UIUtil; import android.content.Context; import android.location.Location; /** * 常駐型サービスのサンプル。 * 現在地を定期的にDBに記録する。 * @author id:language_and_engineering * */ public class SamplePeriodicService extends BasePeriodicService { // 画面から常駐を解除したい場合のために,常駐インスタンスを保持 public static BasePeriodicService activeService; @Override protected long getIntervalMS() { return 1000 * 10; } @Override protected void execTask() { // インスタンスを保持 activeService = this; // GPS情報のDB記録処理を非同期で開始 final Context context = getContext(); new AsyncTasksRunner( new ISequentialRunnable[]{ // 現在地を検出する非同期タスク。 new GetMyLocationEventTask(context){ @Override protected boolean onLocationReceived( Location location ) { // 次のタスクに渡して処理させる storeData( "location_result", location ); return CONTINUE_TASKS; } } , // 位置情報のDB登録を行なうタスク。 new SequentialAsyncTask(){ public boolean main(){ // 前のGPS処理の結果を取りだす Location location = (Location)getDataFromRunner("location_result"); // 地名に変換する。NW接続が必要な重い処理なので,このタイミングで呼び出す。 String geo_str = LocationUtil.location2geostr(location, context); // DB登録 new LocationLogDAO(context).onNewLocationReceived( location, geo_str ); UIUtil.longToastByHandler( getHandler(), context, "サービスが現在地を検出しました。\n" + geo_str + "\n※アプリの常駐停止ボタンから停止できます。" ); return CONTINUE_TASKS; } } }) .withoutDialog() .whenAllTasksCompleted(new RunnerFollower(){ @Override protected void exec() { // ログ出力 Util.d("GPS処理が完了しました。"); // 次回の実行について計画を立てる makeNextPlan(); } }) .begin(); } @Override public void makeNextPlan() { this.scheduleNextTime(); } /** * もし起動していたら,サービスの常駐を解除する。 * 既に起動済みのタスクがある場合,タスクは中断されない。 */ public static void stopResidentIfActive(Context context) { if( activeService != null ) { activeService.stopResident(context); } } }