我正在创建一个接收器,捕获电源按钮按下,目前它的工作,但它的行为并不像我想要的。在它的定义中,如果用户在不到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);
}
}发布于 2015-03-18 02:58:38
来自电源按钮的切换屏幕状态的触发器在接收时排队,并由PowerManagerService处理。以这种方式,开关事件被有效地去除,使得在按钮按下和系统广播之间不一定有1:1的映射来切换屏幕状态(或者甚至实际的屏幕开/关事件)。
https://stackoverflow.com/questions/29107257
复制相似问题