第一次接触被忽略?

科里·奥格本

我正在研究一个闹钟。作为它的一部分,我有一个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();

该视图非常简单:2个TextView用于显示时间和警报名称,2个可单击的ImageView用于贪睡和禁用。

我遇到的问题是,我第一次触摸屏幕时,什么也没发生。两个ImageView均以a开头,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的末尾设置一个断点,并不断执行,直到最终等待事件发生为止,但是即使在这种状态下,第一次点击也不会在调试器中进行更改。如预期的那样,第二次点击我的ImageViews将在我的单击处理程序中的第一行停止调试器。

编辑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.

第一次点击将以其中两个警告作出响应。第一次之后的其他水龙头不会发出此类警告,并且我的处理程序将按预期执行。

快速搜索返回了这个问题,但对我的情况没有帮助。我认为这不仅仅是警告,可能是为什么忽略了第一次点击的根本原因。但是,我仍然不知道如何解决它。

特杰

不知道这是否是答案还是通用性如何,但是..我设法通过删除以下标志为我解决了这个问题:

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);

我只能推测这两个标志导致第一次触摸的原因。也许是与这些标签相关的“沉浸式”模式,因为它应该(并且确实)隐藏导航,所以它可能在某种程度上与引擎盖发生冲突。.我不知道:-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章