Нажмите «Слушатель» в Android. Как проверить, не нажимается ли кнопка в течение определенного периода времени? - PullRequest
0 голосов
/ 26 января 2012

У меня в приложении 10 разных кнопок для выполнения разных задач.Я хочу разработать один сервис, который постоянно проверяет (прослушивает), и если пользователь не нажимает ни одну кнопку в течение определенного времени, скажем, на 5 секунд, чем я хочу выполнить какую-то другую задачу.Как я могу проверить, что пользователь не нажал ни одной кнопки?Если у вас есть идеи, пожалуйста, дайте мне знать.

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Вы можете просто установить Таймер на желаемую длину.Когда кнопка нажата, просто сбросьте таймер.Запустите таймер в onResume, чтобы он запускался, даже если пользователь возвращается после телефонного звонка или другой деятельности.Вероятно, вам следует также остановить таймер в onPause действия.

1 голос
/ 26 января 2012

В каждом из ваших прослушивателей кликов экономьте время, когда была нажата последняя кнопка:

private long lastClickTimestamp;
private Handler handler = new Handler();

public void onCreate( Bundle saved ) {
   BackgroundJob job = new BackgroundJob();
   handler.postDelayed( job, SECONDS_TO_WAIT * 1000 );

   button1.setClickListener( new OnClickListener() {
       public void onClick( View view ) {
           lastClickTimestamp = System.currentTimeInMillis();
           // do the listener logic for button 1 here.
       }
   });

   button2.setClickListner( new OnClickListener() {
       public void onClick( View view ) {
           lastClickTimestamp = System.currentTimeInMillis();
           // do the listener logic for button 2 here.
       }
   });

   // repeat that for all 10 buttons.
}

Теперь более умный разработчик создаст многократно используемый базовый класс, который обрабатывает установку метки времени один раз, а затем повторно использует этот базовый классв каждой из 10 кнопок.Но это зависит от вас.Тогда фоновое задание будет выглядеть следующим образом:

public class BackgroundJob implements Runnable {

   private boolean done = false;

  // meanwhile in job:
  public void run() {

     if( lastClickTimestamp > 0 && System.currentTimeInMillis() - lastClickTimestamp > SECONDS_TO_WAIT * 1000 ) {
       // let's do that job!
     }

     if( !done ) {
        // reschedule us to continue working
        handler.postDelayed( this, SECONDS_TO_WAIT * 1000 ); 
     }
  }
}

Если вам нужно использовать службу, вы можете отправить в службу уведомление о том, что была нажата кнопка, тогда служба может отслеживать время, когда это произошло,Я бы не стал использовать сервис для этого, потому что для воспроизведения анимации или звука не нужно выживать, если приложение помещено в фоновый режим или убито.Службы предназначены для таких вещей, как воспроизведение музыки, когда кто-то делает что-то другое, приложения для чата или вещи, которые должны работать в фоновом режиме, когда пользователь не взаимодействует с приложением.То, что вы описываете, может быть сделано, как я показал, потому что когда пользователь получает телефонный звонок или текстовое сообщение, он покидает ваше приложение, и анимация или звук, который вы играете, вероятно, тоже должны прекратиться.Довольно легко сделать это с опцией Handler, которую я показал.Сложнее, но выполнимо, с услугой.

0 голосов
/ 26 января 2012

При каждом нажатии кнопки обновляйте какой-либо объект Calendar до нового экземпляра Calendar, а затем вы можете проверить, сколько времени это Calendar, и посмотреть, прошло ли оно больше 5 минут назад.

//this is a field
Calendar calendar;
public void onClick(View v) {
calendar = Calendar.getInstance();
//etc
switch(v.getId()) {
}
}
...