1

在我的应用程序中,我有一个实现计时器任务的服务,通过它我每 10 秒后获取用户的位置。

我坚持的事情是我想在 1 或 2 分钟后停止这项服务以及计时器。

我不能把它的逻辑放在后面。请帮帮我。

public class TimeService extends Service {
// constant
public static final long NOTIFY_INTERVAL = 20 * 1000; // 10 seconds

// run on another Thread to avoid crash
private Handler mHandler = new Handler();
// timer handling
private Timer mTimer = null;
int i=0;

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

@Override
public void onCreate() {
    // cancel if already existed
    if(mTimer != null) {
        mTimer.cancel();
    } else {
        // recreate new
        mTimer = new Timer();
    }
    // schedule task
    mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}

class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {
             @Override
            public void run() {
                // display toast
                Toast.makeText(getApplicationContext(), getDateTime(),
                        Toast.LENGTH_SHORT).show();
                new LongOperation().execute("");
            }
         });
    }

    private String getDateTime() {
        // get date time in custom format
        SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]");
        return sdf.format(new Date());
    }
 }

private class LongOperation extends AsyncTask<String, Void, String> {
            @Override
    protected String doInBackground(String... params) {
        System.out.println("bgnotification Long operation doinbackground called----> "); 
        return "";
    }      

    @Override
    protected void onPostExecute(String result) {
        System.out.println("bgnotification Long operation post execute called----> ");
        if(i<3){ 
            GPSTracker mGPS = new GPSTracker(getApplicationContext());
         onLocationChanged(mGPS);i++;
         Toast.makeText(getApplicationContext(), "HEllo Post execute called",
    }
    @Override
    protected void onPreExecute() {
        System.out.println("bgnotification Long operation pre execute called----> ");
    }
    @Override
    protected void onProgressUpdate(Void... values) {
    }
}


public void onLocationChanged(GPSTracker track) {
    // Getting latitude
    double latitude = track.getLatitude();
    // Getting longitude
    double longitude = track.getLongitude();
     System.out.println( latitude);
     System.out.println(     longitude);
     Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        try
     {
         List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
         Log.e("Addresses","-->"+addresses);              
     }
     catch (IOException e)
     {
         e.printStackTrace();

     }
   }
}
4

3 回答 3

3

@Wishy 要在特定时间停止服务和计时器任务,您需要创建另一个计时器任务,该任务将执行一次,执行持续时间将是您指定的任何时间。在运行方法中,您需要编写 mTimer.purge(); mTimer.cancel() 和 stopService(newIntent(class.this,yourservice.class));

于 2013-08-07T05:47:49.860 回答
0
  1. 覆盖服务类中的 onDestroy() 方法,如下所示:

    @Override public void onDestroy() { super.onDestroy(); if (mTimer != null) { mTimer.cancel(); } }

  2. 在要停止服务的地方调用 stopService() ,如下所示:

stopService(serviceIntent);

就这样。

于 2016-03-23T06:43:33.850 回答
0

一个更简单的解决方案是让 timer public static

public class TimeService extends Service {
//...
private Timer mTimer = null;
//...
}

另一个活动:

//...
if(TimeService.mTimer!=null) TimeService.mTimer.cancel();
//...
于 2016-01-25T01:52:28.220 回答