如何在Android应用程序中获得侧电源按钮点击计数?

时间:2017-08-02 06:32:07

标签: java android

我正在开发一个应用程序,在电源按钮上点击一个号码(4次),但现在问题是当用户按下主页按钮4次时它将触发呼叫,我只想点击侧面电源按钮。

2 个答案:

答案 0 :(得分:0)

我在清单中的接收器和服务

    <receiver
        android:name=".services.SOSBroadcastReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.SCREEN_OFF"/>
            <action android:name="android.intent.action.SCREEN_ON"/>
        </intent-filter>
    </receiver>

  <service
        android:name=".services.SOSService"
        android:enabled="true">
    </service>

和我的BroadcastReceiver class

    public class SOSBroadcastReceiver extends BroadcastReceiver
{

    private static long lastTriggerTime = 0;
    private static final int ONE_MILLI = 1000;
    protected static final long ONE_SEC = 1 * ONE_MILLI;
    protected static final long TWO_SEC = 2 * ONE_MILLI;
    protected static final long THREE_SEC = 3 * ONE_MILLI;
    protected static final int TRIGGER_THRESHOLD = 3;

    protected static boolean triggerInProgress = false;

    protected static int triggerCounter = 0;

    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent.getAction().contains(Intent.ACTION_SCREEN_ON))
        {
            if (!triggerInProgress)
            {
                checkAndCreateAlert(context);
            }

        }
        else if (intent.getAction().contains(Intent.ACTION_SCREEN_OFF))
        {
            if (!triggerInProgress)
            {
                checkAndCreateAlert(context);
            }
        }
    }

    private void checkAndCreateAlert(Context context)
    {

        /*---- If the gap between power button press is less than 2 seconds ----*/
        if ((System.currentTimeMillis() - lastTriggerTime) <= TWO_SEC
                || (triggerCounter == 0))
        {
            triggerCounter++;
            lastTriggerTime = System.currentTimeMillis();
        }
        else
        {
            triggerCounter = 0;
        }

        if (triggerCounter > TRIGGER_THRESHOLD)
        {
            ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000);
            triggerInProgress = true;

            Intent intent = new Intent(context, SOSActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("timer", true);
            context.startActivity(intent);

            triggerInProgress = false;
            triggerCounter = 0;
        }
    }
}

我的代码会根据screen_on和screen_off事件保持电源按钮的点击次数,如果电源按钮按2次超过3次,则执行另一种方法。

这是我的Service class

 public class SOSService extends Service
   {
    BroadcastReceiver mReceiver;
    IntentFilter pqrs_intentFilter;

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

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

    @Override
    public void onDestroy()
    {

        unregisterReceiver(mReceiver);

    }

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

        pqrs_intentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
        pqrs_intentFilter.addAction(Intent.ACTION_SCREEN_ON);

        mReceiver = new SOSBroadcastReceiver();
        registerReceiver(mReceiver, pqrs_intentFilter);
    }

    public void onStop(Intent intent)
    {
        unregisterReceiver(mReceiver);
    }
}

答案 1 :(得分:0)

public class ExampleActivity extends Activity {

   @Override
    protected void onCreate() {
        // INITIALIZE RECEIVER
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
        // YOUR CODE
    }

    @Override
    protected void onPause() {
        // WHEN THE SCREEN IS ABOUT TO TURN OFF
        if (ScreenReceiver.wasScreenOn) {
            // THIS IS THE CASE WHEN ONPAUSE() IS CALLED BY THE SYSTEM DUE TO A SCREEN STATE CHANGE
            System.out.println("SCREEN TURNED OFF");
        } else {
            // THIS IS WHEN ONPAUSE() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        // ONLY WHEN SCREEN TURNS ON
        if (!ScreenReceiver.wasScreenOn) {
            // THIS IS WHEN ONRESUME() IS CALLED DUE TO A SCREEN STATE CHANGE
            System.out.println("SCREEN TURNED ON");
        } else {
            // THIS IS WHEN ONRESUME() IS CALLED WHEN THE SCREEN STATE HAS NOT CHANGED
        }
        super.onResume();
    }

}

<强>接收机

public class ScreenReceiver extends BroadcastReceiver {

    private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            screenOff = true;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        }
        Intent i = new Intent(context, UpdateService.class);
        i.putExtra("screen_state", screenOff);
        context.startService(i);
    }

}

<强>服务

public static class UpdateService extends Service {

        @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);
            BroadcastReceiver mReceiver = new ScreenReceiver();
            registerReceiver(mReceiver, filter);
        }

        @Override
        public void onStart(Intent intent, int startId) {
            boolean screenOn = intent.getBooleanExtra("screen_state", false);
            if (!screenOn) {
                // YOUR CODE
            } else {
                // YOUR CODE
            }
        }
}

希望这很有用。如果您有疑问,请告诉我。