Как повторить метод каждые 10 минут после нажатия кнопки и завершения ее на другой кнопке нажмите

17

Я пишу приложение для Android, которое извлекает текущее местоположение телефона и отправляет ему также веб-сервер. Я хочу, чтобы можно было нажать кнопку «Пуск», и приложение продолжает извлекать и отправлять местоположение в заданный интервал (скажем, каждые 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, вероятно, достигнет того, чего я хочу, но я не смог понять ничего из этого. Есть ли какие-либо четкие шаги или шаблоны, которые будут работать в моей ситуации.

    
задан X-Man 19.04.2012 в 07:10
источник

5 ответов

34

Создайте 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 , то что-то вроде этого поможет вам. Прежде чем идти на это, отметьте разницу между таймером и будильником

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)

См Ссылка

Ссылка

    
ответ дан coderplus 19.04.2012 в 07:54
источник
3

Используйте Android-TimerTask или Android-AlarmManager для отправки данных о местоположении каждые 10 минут. Посмотрите на этот вопрос SO Track Gps Через каждые 10 минут, используя таймер в android также этот Хороший способ получить местоположение пользователя в Android

TimerTask:

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

    
ответ дан user370305 19.04.2012 в 07:18
источник
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);
    
ответ дан drulabs 19.04.2012 в 15:12
источник
0

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

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

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;
         }
     }
}
    
ответ дан Sandip Jadhav 19.04.2012 в 07:27
источник
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();
    
ответ дан Zacharias Manuel 19.04.2012 в 07:46
источник