Android 知道窗口是否有焦点的可靠方法?

Android 知道窗口是否有焦点的可靠方法?,android,Android,我正在寻找一种可靠的方法来确定窗口是否有焦点 我已经阅读了的文档,其中写道:请记住,onResume并不是用户可以看到您的活动的最佳指示器;系统窗口(如键盘防护装置)可能在前面。使用onWindowFocusChanged(布尔值)确定您的活动对用户可见 然后我阅读了的文档,上面写着:当活动的当前窗口获得或失去焦点时调用Q1)这是否意味着onWindowFocusChanged(布尔)阻塞而不是使用回调? 我也阅读和阅读 并提出: @Override protected void onResu

我正在寻找一种可靠的方法来确定窗口是否有焦点

我已经阅读了的文档,其中写道:请记住,onResume并不是用户可以看到您的活动的最佳指示器;系统窗口(如键盘防护装置)可能在前面。使用
onWindowFocusChanged(布尔值)
确定您的活动对用户可见
然后我阅读了的文档,上面写着:当活动的当前窗口获得或失去焦点时调用Q1)这是否意味着
onWindowFocusChanged(布尔)
阻塞而不是使用回调?

我也阅读和阅读


并提出:

@Override
protected void onResume () {
    super.onResume();
    if(!hasWindowFocus()) // I don't want to wait for a windowFocusChanged event if this window already has the focus
        onWindowFocusChanged(true); // I assume this method blocks
    //This window has the focus.... do stuff
    //...
}
Q2)此代码是否确保窗口具有焦点?



感谢

要确认您的活动处于焦点或用户可见状态,您可以在后台启动一项服务,该服务将持续检查最上面的活动

要检查最重要的活动,请使用以下命令

Context context = someArbitraryContext;
ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);
String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName();
String className = am.getRunningTasks(1).get(0).topActivity.getClassName();
如果包名和类名与您的匹配,则表示您的活动处于焦点

注意:不要忘记在清单中添加
android:name=“android.permission.GET_TASKS”
权限


希望它能帮助你。

@Shashank谢谢。我没有,因为我不知道如何处理
requestFocus()
中的
false
。我想这意味着您需要覆盖
onWindowFocusChanged
?谢谢。让一个服务在后台进行检查对我来说是一种过分的行为。巧妙的tho.我认为对这样一项任务再获得一次许可是一种过激的行为。。。然而,这是一个巧妙的解决方案。