我正在制作一个闹钟。作为其中的一部分,我有一个IntentService
,当警报实际发生时,它会启动一个活动。在活动的onCreate
我正在唤醒屏幕,获取唤醒锁定,强制活动全屏播放,并播放声音。这就是onCreate中的所有内容:
super.onCreate(savedInstanceState);
// Get Alarm ID from the extras
Bundle extras = getIntent().getExtras();
int id = extras.getInt("AlarmID", -1);
// Get Alarm info from the DB
DB = new DatabaseHelper(this);
alarm = DB.getAlarm(id);
if (alarm == null || !alarm.isEnabled()) finish();
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_alarm);
// My root view
View contentView = findViewById(R.id.fullscreen_content);
// Hide action bar for full screen
ActionBar bar = getActionBar();
if (bar != null) bar.hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Hide nav bar
mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS);
mSystemUiHider.setup();
mSystemUiHider.hide();
// Show over lock screen
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// Wake up screen
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "MyWakeLock");
wakeLock.acquire();
// Get UI Elements
TextView time = (TextView)findViewById(R.id.Time);
TextView name = (TextView)findViewById(R.id.SmallAlarmName);
// Fill UI Elements
time.setText(Alarm.FormatTime(alarm.getHour(), alarm.getMinute()));
name.setText(alarm.getName());
// Play selected ringtone
tone = RingtoneManager.getRingtone(this, alarm.getSound());
tone.setStreamType(RingtoneManager.TYPE_ALARM);
tone.play();
视图相当简单:2x TextViews显示闹钟的时间和名称,2x可点击的ImageViews用于暂停和禁用。
我遇到的问题是,当我第一次触摸屏幕时,没有任何反应。两个ImageView都以Log.i
开头,因此我知道如果事件触发我何时推送它。在第一次推送时,没有日志输出。在第二次推送时,会触发正确的ImageView事件。如果在创建活动时屏幕最初打开或关闭并不重要,则第一次触摸可以被非常重复地忽略。发生了什么,我该如何修复它,以便第一次触摸按预期工作?
我正在测试我的Nexus 5,4.4.3,Rooted,stock rom,Xposed Framework(但没有会影响我的应用的模块)。我无法真正在虚拟机中进行测试,因为需要使用铃声(VM没有铃声)。
此外,对于记录,第一次点击不会发生其他日志。我不知道手机认为我在点什么。
编辑:我认为这与旗帜有关。我注意到我在通话setFlags
中呼叫addFlags
而不是getWindow().setFlags(...)
。相反,我将其更改为addFlags
并尝试将其更改为:
int flags = WindowManager.LayoutParams.FLAG_FULLSCREEN |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
getWindow().addFlags(flags);
但没有变化。
有没有办法可以说明第一次点击可能会截获什么?
我尝试在onCreate的末尾设置一个断点并不断地逐步调整,直到最终等待事件发生,但即使在这种状态下,第一次点击也不会在调试器中进行更改。按照预期,第二次点击我的一个ImageView将停止我的点击处理程序内第一行的调试器。
编辑2:我想我正在做点什么。我正在通过过滤器观看logcat,只看到与我的应用程序相关的内容。我尝试在没有过滤器的情况下查看logcat,并且能够在第一次点击时可靠地获取这些类型的消息:
06-12 23:28:04.437 812-844/? W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
第一次点击将响应其中两个警告。第一个之后的额外点击将不会发出此类警告,我的处理程序将按预期执行。
使用this question进行快速搜索,但对我的情况无益。不仅仅是一个警告,我认为这可能是为什么第一次点击被忽略的根本原因。但是,我仍然不知道如何解决它。
答案 0 :(得分:8)
不确定这是否是答案或者它是多少普遍,但是......我通过删除这些标志设法解决了这个问题:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
我只能推测为什么那两个标志会导致第一次触摸无知。也许它是沉浸式模式"与这些标签相关联,因为它本身应该(并且确实)隐藏导航,所以也许它会在引擎盖下发生冲突......我不知道: - )
答案 1 :(得分:-1)
我建议您将大部分代码放入onStart()并在onCreate()中设置内容视图。我建议的另一件事。不使用布局XML中的android:onClick=""
属性,而是使用侦听器并通过代码将其分配给按钮。但那更像是“关注的分离”。