0

電源ボタンのプレスをキャプチャするレシーバーを作成していますが、今のところ動作していますが、希望どおりに動作していません。ユーザーが 5 秒以内に 5 回押した場合に特定のアクションを実行するように定義されていますが、現時点ではそれほど反応がなく、受信者が指定されたアクションを実行するために 5 回以上押す必要がある場合もあります。

誰かが私のコードを改善する方法を教えてもらえますか ありがとう

これが私のReceiver.classです:

public class Receiver extends BroadcastReceiver {
    public boolean successfull = false;
    public boolean test = false;
    int presses;
    long time;
    SharedPreferences prefs;
    private Context context;

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

        AudioManager manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        if (manager.getMode() != AudioManager.MODE_IN_CALL) {
            this.context = context;
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF) || intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                calculationLogic();
            }
        }
    }

    public void calculationLogic() {
        prefs = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
        presses = prefs.getInt("repeats", 0);
        Log.d("--", "Power pressed, #presses: " + presses);

        Log.d("--", "time " + System.currentTimeMillis());
//            screenOff = true;
        time = System.currentTimeMillis();
        //saving initial power btn press
        if (prefs.getLong("time", 0) == 0) {
            Log.d("receiver", "40");
            prefs.edit().putLong("time", time).apply();
            presses += 1;
        } else {
            Log.d("receiver", "44");
            //calculate the difference between the first power press and current power press
            Log.d("--", "time diff = " + time + " - " + prefs.getLong("time", 0) + " = " + (time - prefs.getLong("time", 0)));
            if (time - prefs.getLong("time", 0) > 5000) {
                reset();
                if (test) {
                    vibrate();
                    ((IntroActivity) context).onBackPressed();
                    ((IntroActivity) context).showTestSuccess(successfull);
                    context.unregisterReceiver(this);
                }
                Log.d("receiver", "fail");
            } else {
                if (presses == 5) {
                    Log.d("receiver", "success");
                    reset();
                    successfull = true;
                    Log.d("--", "staring activity");
                    vibrate();
                    //TODO

                    if (!test) {
                        doAction(context);
                    } else {
                        ((IntroActivity) context).onBackPressed();
                        ((IntroActivity) context).showTestSuccess(successfull);
                        context.unregisterReceiver(this);
                    }
                    time = 0;
                } else {
                    presses += 1;
                    Log.d("receiver", "presses so far " + presses);
                }
            }
        }
        prefs.edit().putInt("repeats", presses).apply();

    }

    private void reset() {
        presses = 0;
        prefs.edit().remove("time").apply();
    }

    private void vibrate() {
        Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
        v.vibrate(200);
    }

    private void doAction(Context context) {
        Log.d("receiver", "STARTING main");
        Intent i = new Intent();
        i.setClass(context, SplashActivity.class);
//        i.setClassName("com.emergencyapp", ".SplashActivity");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }


}
4

1 に答える 1

0

画面の状態を切り替えるための電源ボタンからのトリガーは、受信時にキューに入れられ、によって処理されPowerManagerServiceます。このようにして、スイッチ イベントは効果的にデバウンスされるため、ボタンの押下と画面の状態 (または実際の画面のオン/オフ イベント) を切り替えるためのシステム ブロードキャストとの間で必ずしも 1:1 のマッピングが行われるわけではありません。

さらに、この内部キューイングと実際のブロードキャスト配信 (可変) の間の遅延により、受信しているイベントからボタンが押される正確なタイミングを計ることが困難になります。

于 2015-03-17T18:58:38.113 に答える