首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >接收器捕获电源按钮按下

接收器捕获电源按钮按下
EN

Stack Overflow用户
提问于 2015-03-18 02:45:18
回答 1查看 370关注 0票数 0

我正在创建一个接收器,捕获电源按钮按下,目前它的工作,但它的行为并不像我想要的。在它的定义中,如果用户在不到5秒内按下5次,就会执行特定的操作,但现在它的响应性不是很好,有时需要按下5次以上,所以接收器会执行指定的操作。

有人能告诉我如何改进我的代码吗?谢谢

这是我的Receiver.class:

代码语言:javascript
运行
复制
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);
    }


}
EN

回答 1

Stack Overflow用户

发布于 2015-03-18 02:58:38

来自电源按钮的切换屏幕状态的触发器在接收时排队,并由PowerManagerService处理。以这种方式,开关事件被有效地去除,使得在按钮按下和系统广播之间不一定有1:1的映射来切换屏幕状态(或者甚至实际的屏幕开/关事件)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29107257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档