Mic*_*rov 27 service user-interface android
在facebook chatheads中,这是facebook messenger应用程序的一部分,我注意到以下行为:据我所知,聊天头本身和打开的聊天屏幕都是服务的一部分.不涉及任何活动.
我怎么能确定?在我打开的聊天屏幕上按回家后,它被最小化回聊天头,我可以立即重新打开聊天屏幕.如果聊天屏幕是活动,则startActivity(intent)
在按下主页按钮后重新打开活动将延迟活动的开始,如此处所指定:
在按下HOME按钮后从服务启动活动而没有延迟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 聊天头的工作原理。
好的,完成我的答案的编辑,
在您的活动中覆盖以下方法。
@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)
试试这个希望有帮助