2015-08-20 3 views
0

я успешно разработал приложение для Android, которое сосчитать кнопки питания нажмите с помощью приемника класса и работает в фоновом режиме с обновление-сервис класса и теперь я хочу, чтобы вставить запись в базу данных, когда кто-нибудь нажмите кнопку питания 3 - 5 раз быстро (в секундах может составлять от 2 до 4 секунд). Все работает нормально, но проблема в обслуживании работает в фоновом режиме, поэтому он будет учитывать, когда пользователь случайно нажал кнопку питания (например, на экран телефона вкл. И выкл.). Итак, как остановить этот подсчет случайного или обычного нажатия кнопки питания. также мой вопрос заключается в том, что служба работает в фоновом режиме, я могу сбросить сервис, чтобы создать новый запрос, когда пользователь хочет вставить запись. Спасибо заранее! Вот мой код: -мощность заблокированные в данный момент времени

Главная

{Home.this.startService(new Intent(Home.this, UpdateService.class));} 

Мой UpdateService

@Override 
public void onCreate() { 
    super.onCreate(); 

     //register receiver that handles screen on and screen off logic 

     IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF);  
     mReceiver = new MyReceiver(UpdateService.this); 
     registerReceiver(mReceiver, filter); 




} 

@Override 
public void onDestroy() { 

    unregisterReceiver(mReceiver); 
    Log.i("onDestroy Reciever", "Called"); 
    super.onDestroy(); 

} 

@Override 
public void onStart(Intent intent, int startId) { 

}

MyReceiver

public class MyReceiver extends BroadcastReceiver { 

private static int countPowerOff=0; 
private boolean screenOff; 
private UpdateService updateservice=null; 

public MyReceiver (UpdateService UpdateService) 
{ 
     this.updateservice=UpdateService;    
} 

@Override 
public void onReceive(Context context, Intent intent) { 


     if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) 
     { 
     countPowerOff++ 
     } 
     else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) 
     { 
     } 
    if(countPowerOff > 3) 
     { 
     //record insert 
     } 

}

ответ

0

Используйте обратный вызов Hander для выполнения сброса счетчика кликов.

public class MyReceiver extends BroadcastReceiver { 

    private static final int POWER_OFF_TIMEOUT = 500; 
    private Handler handler = new Handler(); 
    private Runnable powerOffCounterReset = new PowerOfTimeoutReset(); 

    private int countPowerOff = 0; 
    private boolean screenOff; 
    private UpdateService updateService = null; 


    public MyReceiver (UpdateService updateService) { 
     this.updateService = updateService; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { 
     countPowerOff++ 
     } else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { } 

     if(countPowerOff > 3) { 
      //record insert 
      countPowerOff = 0; 
      canclePowerOffTimeout(); 
     } else { 
      resetPowerOffTimeout(); 
     } 
    } 

    private void resetPowerOffTimeout() { 
      canclePowerOffTimeout(); 
      startPowerOffTimeout(); 
    } 

    private void startPowerOffTimeout() { 
     handler.postDelayed(powerOffCounterReset, POWER_OFF_TIMEOUT); 
    } 

    private void canclePowerOffTimeout() { 
     handler.removeCallback(powerOffCounterReset); 
    } 


    private class PowerOfTimeoutReset implements Runnable { 

     public void run() { 
      countPowerOff = 0; 
     } 

    } 

} 
+0

вы можете дать какой-либо идеи сэра –

+0

я думал, что даю правильное представление для решения вопроса будет более полезным, чем Юст проводки код, который будет Dü работы. –

+0

спасибо sir, но при каждом запросе нажатия кнопки питания он переходит в другое состояние if (countPowerOff> 3) else и вызывает ** resetPowerOffTimeout(); ** –

0

Попробуйте это. Публично метод в службе:

private int counter = 0; 

    private CountDownTimer timer = new CountDownTimer(2000, 1000) { 
     @Override 
     public void onTick(long l) { 

     } 

     @Override 
     public void onFinish() { 
      counter = 0; 
     } 
    }; 

    public void count(){ 
     counter++; 
     if (counter == 3) { 
      //do your staff 
      return; 
     } 

     timer.cancel(); 
     timer.start(); 
    } 

и в ресивере в OnReceive() метод просто вызвать service.count()

Кстати, экран может выключиться, даже если пользователь не нажмет питание кнопка. Кроме того, вы считаете только каждый второй нажав - когда экран выключен, нажатие кнопки питания включает его, но вы не считаете. Почему бы вам просто не нажимать кнопки питания? Он требует

<uses-permission android:name="android.permission.PREVENT_POWER_KEY" /> 

разрешение. Код:

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     Log.d("111", "keydown: " + event.getKeyCode()); 
     if (keyCode == KeyEvent.KEYCODE_POWER) { 
      //call service.count() 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
+0

спасибо сэр, но мое приложение работает в фоновом режиме, поэтому он будет прослушивать кнопку питания, даже приложение закрыто. Думаю, ** onKeyDown ** будет работать только тогда, когда приложение открыто. –

+0

вы можете сделать невидимое диалоговое окно предупреждения над всеми видами на экране и поймать любой событие keydown в нем. Я разрабатываю приложение для блокировки экрана, и оно работает. Вы также можете отклонить его, когда захотите. Я использую этот HomeKeyLocker: https://github.com/shaobin0604/Android-HomeKey-Locker/blob/master/HomeLockerLib/src/main/java/io/github/homelocker/lib/HomeKeyLocker.java –

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