2012-04-19 2 views
17

Я пишу приложение для Android, которое извлекает текущее местоположение телефона и отправляет его также на веб-сервере. Я хочу, чтобы у вас была возможность нажать кнопку «Пуск», и приложение продолжает извлекать и отправлять местоположение в заданный интервал (скажем каждые 10 минут), а затем останавливать его нажатием другой кнопки.Как повторить метод каждые 10 минут после нажатия кнопки и завершения ее на другой кнопке

Вот код для моих кнопок:

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    startButton.setOnClickListener(new OnClickListener() { 
    @Override 
    //When the button is clicked 
    public void onClick(View v) { 
      finishButton.setEnabled(true); 
      startButton.setEnabled(false); 

      //Loops every 10mins 
      pingCurrentLocation(); 

     } 
    }); 

    finishButton.setOnClickListener(new OnClickListener() { 
    @Override 
    //When the button is clicked 
    public void onClick(View v) { 
      startButton.setEnabled(true); 
      finishButton.setEnabled(false); 

      pingCurrentLocation(); 

     } 
    }); 
} 

pingCurrentLocation это функция, которая получает местоположение и отправляет его.

Я знаю, что использование AlarmManager, вероятно, достигнет того, что я хочу, но я не смог понять ни одного из них. Есть ли четкие шаги или шаблоны, которые будут работать в моей ситуации.

+1

Я не понимаю, диспетчер аварийных сообщений - это идеальный способ сделать это .... Я делаю то же самое, используя диспетчер аварийных сигналов. Сервис съедает память, и мне не нравятся темы, поэтому я выбрал AlarmManager. Вы хотите, чтобы я разделил мой код здесь? – drulabs

+0

Я знаю, что было бы идеально, если бы у меня было много проблем с его реализацией. Если вы не возражаете поделиться своим кодом, это будет здорово. –

+0

@ X-Man - я обновил ответ с подробной информацией об использовании комбинации AlarmManager/BroadcaseReceiver. – coderplus

ответ

35

Создать BroadcastReceiver

public class AlarmReceiver extends BroadcastReceiver 
{ 

@Override 
public void onReceive(Context context, Intent intent) 
    { 
    //get and send location information 
    } 
} 

и добавить тот же к вашему AndroidManifest, так что приемник зарегистрирован

<receiver 
    android:name="com.coderplus.AlarmReceiver" 
    android:exported="false"> 
</receiver> 

Теперь вы можете установить повторяющийся сигнал тревоги от вашего Activity который будет ссылаться на приемник каждый 10 минут:

AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),600000, 
                     pendingIntent); 

и для отменить сигнал тревоги, вызов cancel() на AlarmManager с использованием эквивалентной PendingIntent

AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
Intent intent = new Intent(context, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 
alarmManager.cancel(pendingIntent); 

или если вы не хотите использовать AlarmManager/BroadcastReceiver, то что-то подобное, это поможет вам.Перед тем, как пойти на это, проверьте - difference between timer and alarmmanager

private class MyTimerTask extends TimerTask { 
    @Override 
    public void run() {   
     //get and send location information 
    } 
} 

инициализировать Timer и Timer задачу:

Timer myTimer = new Timer(); 
MyTimerTask myTimerTask= new MyTimerTask(); 

остановить или запустить Timer

//to Stop 
myTimer.cancel(); 
//to start 
myTimer.scheduleAtFixedRate(myTimerTask, 0, 600000); //(timertask,delay,period) 

См http://developer.android.com/reference/java/util/TimerTask.html

http://developer.android.com/reference/java/util/Timer.html

+0

Это работает, однако есть проблема. Когда я нажимаю кнопку «Пуск», которая выполняет «myTimer.scheduleAtFixedRate (myTimerTask, 0, 600000);» и нажимает кнопку «Стоп/Отмена», а затем снова нажимает кнопку «Запуск», когда приложения выходят из строя. –

+0

@coderplus: Что, если я убью приложение из памяти? Будет ли он работать? –

3

Используйте Android-TimerTask или Android-AlarmManager для отправки данных о местоположении каждые 10 минут. Посмотрите на этот вопрос SO Track Gps At every 10 minutes using timer in android также это один Good way of getting the user's location in Android

TimerTask:

TimerTask класс представляет собой задачу, чтобы запустить в указанное время. Задача может выполняться один или несколько раз.

0

Вы можете начать сервис, который будет проверять местоположение пользователя &, чтобы отправить его на указанный вами веб-адрес, как указано ниже.

вы можете получить более подробную информацию об услуге here

public class TaxiLocationUpdator extends Service{ 
    Location location; 
    Timer timer = new Timer(); 
    private final Handler handler = new Handler(); 
    Intent intent; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void onCreate(){ 
     super.onCreate(); 
     updateNotification(); 
    } 

    //int onStartCommand(Intent intent, int flags, int startId) 
    public void onStart(Intent intent,int startId){ 
     super.onStart(intent, startId); 
     handler.removeCallbacks(sendUpdatesToUI); 
      handler.postDelayed(sendUpdatesToUI, 1000); // 1 second 
     Log.v("Location Servics", "Start Service"); 
    } 

    private Runnable sendUpdatesToUI = new Runnable() { 
      public void run() { 
       DisplayLoggingInfo();   
        handler.postDelayed(this, 15000); // 60 seconds here you can give your time 
      } 
     };  

    public void onDestroy(){ 
     super.onDestroy(); 
     Log.v("Location Servics", "Destroy Service"); 
    } 

    public boolean isOnline(){ 
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
      boolean isconnected; 
      if (netInfo==null || !netInfo.isConnected()) 
      isconnected=false; 
      else 
      isconnected=true; 
      Log.v("isOnliNe",isconnected+""); 
      return isconnected; 
     } 

    protected void updateNotification() { 
      LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
      LocationListener locationListener = new MyLocationlistener(); 

      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, normallocationwait, 0.250f, locationListener); 
      location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     } 

     private class MyLocationlistener implements LocationListener { 

     public void onLocationChanged(Location location){ 
      if(location!=null){ 
       if(location.hasAccuracy()){ 
         dumpLocation(location); 
       }else{ 
         dumpLocation(location); 
       } 
      } 
     } 

     public void onProviderDisabled(String provider){ 
      Log.v("Loc Update","\nProvider disabled: " + provider); 
     } 

     public void onProviderEnabled(String provider){ 
      Log.v("Loc Update","\nProvider enabled: " + provider); 
     } 

     public void onStatusChanged(String provider, int status, Bundle extras){ 
      Log.v("Loc Update","\nProvider status changed: " + provider + ", status=" 
         + status + ", extras=" + extras); 
     } 

     private void dumpLocation(Location location) { 
       if (location == null) 
         Log.v("Loc Update","\nLocation[unknown]"); 
       else{ 
         Log.v("Loc Update","\n" + location.toString()); 
         Log.v("Demo", location.toString()); 
           String url = Your url; 
         Toast.makeText(getBaseContext(), "Location Update", Toast.LENGTH_SHORT).show(); 
         if(isOnline()){ 
          HttpClient httpclient = new DefaultHttpClient(); 
          HttpPost httppost = new HttpPost(url); 
          try { 
           HttpResponse response = httpclient.execute(httppost); 
           Log.v("Message", response.toString()); 
           } catch (ClientProtocolException e) { 
            Log.e("Sending Message",e.getMessage().toString()); 
           } catch (IOException e) { 
            Log.e("Sending Message",e.getMessage().toString()); 
          } 
        } 
       } 
      } 

     public boolean isOnline(){ 
      ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
      boolean isconnected; 
      if (netInfo==null || !netInfo.isConnected()) 
      isconnected=false; 
      else 
      isconnected=true; 
      Log.v("isOnliNe",isconnected+""); 
      return isconnected; 
     } 
    } 
} 
0

Используйте нить и обработчик

Handler alarmCheckHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 

       System.out.println("getting message from alarm thread"); 
       //Call your function for ping 



    }; 
Thread alarmCheckThread = new Thread() { 
     public void run() { 
      int i = 0; 
      synchronized (this) { 
       while (checkflag) { 
        i++; 
        try { 
         sleep(1000); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        if (i == 600) { 
         alarmCheckHandler.sendMessage(alarmCheckHandler 
           .obtainMessage()); 
         i = 0; 
        } 

       } 
       System.out.println("End of unlimited while loop reched"); 
      } 
     } 
    }; 

Для запуска вызова

alarmCheckThread.start(); 

Для остановки вызова

alarmCheckThread.interrupt(); 
+1

'interrupt' устарел и как его остановить? – zionpi

3

Вот что я сделал.

создал объект менеджера сигнализации первый и установите повторяющийся таймер

AlarmManager alarmMgr = alarmMgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
Intent alarmIntent = alarmIntent = new Intent("AlarmIntentReceiver"); 
PendingIntent pendingAlarmIntent = pendingAlarmIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, alarmIntent, 0); 
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 30*1000, 3*60*1000, pendingAlarmIntent); //start in 30 secs and rest in 3 mins interval 

Создана деятельность на основе этого намерения имени, которое будет фиксировать намерение и выполнить его код в интервале заданного, вы можете также создать радиовещательный приемник если хотите.

Чтобы отменить его при нажатии кнопки мыши. Напишите это

alarmMgr.cancel(pendingAlarmIntent); 
+0

Что такое «контекст»? Каковы его ценности? извините, я новичок в программировании. –

+2

Контекст - это интерфейс для глобальной информации о среде приложения. Это абстрактный класс, реализация которого обеспечивается системой Android. Он позволяет получать доступ к ресурсам и классам приложений, а также к вызовам для приложений на уровне приложений, таким как запуск, трансляция и получение намерений и т. Д. Здесь вы можете прочитать здесь (http://developer.android.com/ reference/android/content/Context.html) ... Если вы не понимаете контекст, вам, вероятно, сначала нужно пройти некоторые основы андроидов ... – drulabs

+0

Итак, в коде я могу использовать контекст как 'this' правильно? –

Смежные вопросы