在android服务中检测'home button pressed'事件,显示一个UI(类似于facebook chatheads)

Mic*_*rov 27 service user-interface android

在facebook chatheads中,这是facebook messenger应用程序的一部分,我注意到以下行为:据我所知,聊天头本身和打开的聊天屏幕都是服务的一部分.不涉及任何活动.

我怎么能确定?在我打开的聊天屏幕上按回家后,它被最小化回聊天头,我可以立即重新打开聊天屏幕.如果聊天屏幕是活动,则startActivity(intent)在按下主页按钮后重新打开活动将延迟活动的开始,如此处所指定: 在按下HOME按钮后从服务启动活动而没有延迟5秒

在这里:按下主页按钮显示活动5秒延迟的原因?

在我的服务onCreate方法中,我使用以下代码从服务中显示UI:

public class ServiceTest extends Service {
...
    @Override 
    public void onCreate() {
        super.onCreate();

        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

        windowManager.addView(someView, params);
    }
....
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道如何直接从显示用户界面的服务接收"按下主页按钮"事件?当用户按下主页按钮时,我想最小化我的视图(类似于Facebook聊天头).

Tal*_*nel 10

在对这个问题进行自己的研究之后,我得出了以下结论:

Facebook通过提供flag TYPE_SYSTEM_OVERLAY属性"拦截"导航按钮.看看这个由@jawsware提供的帖子答案

做他建议不做的事 - 将导致控制导航按钮的"影响"

使用此标志可以将焦点放在叠加层上,并从后面的活动中获得焦点.

使用onFocusChangedListener视图回调或OnKey侦听器,他们通过关闭叠加层的全屏模式对其做出反应.

这也解释了他们如何通过3个导航按钮 - 主页/后退/最近的任务对它做出反应


小智 5

您可以通过覆盖 View.onCloseSystemDialogs() 来实现它。您可能需要检查 View.java,因为此方法在 API 文档中不可见。

显然,我们通常无法检测到“按下主页按钮”。在大多数情况下,窗口是由 startActivity() 创建的。而CloseSystemDialogs例程,由'Home键被按下'引起,由android框架的内部类PhoneWindow.DecorView作为ViewRootImpl的视图祖先处理。但是当我们直接向窗口管理器添加视图时,ViewRootImpl 的视图祖先是我们的自定义视图,但是PhoneWindow.DecorView。查看 ViewRootImpl.java 的源代码可能更容易理解。

KeyEvent.KEYCODE_APP_SWITCH 也会导致 closeSystemDialogs 例程。这解释了 facebook 聊天头的工作原理。


Var*_*D G 2

好的,完成我的答案的编辑,

在您的活动中覆盖以下方法。

 @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
    }
Run Code Online (Sandbox Code Playgroud)

重写上述方法后,现在您可以使用 onKeyDown() 方法轻松监听活动中 HOME 键的按下。

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {     

        if(keyCode == KeyEvent.KEYCODE_HOME)
        {
           //The Code Want to Perform. 
        }
    });
Run Code Online (Sandbox Code Playgroud)

试试这个希望有帮助