In facebook chatheads, that are part of the facebook messenger app, I noticed the following behavior: As far as I can see, the chat head itself and the opened chat screen are all parts of a service. No activity is involved.
How can I be sure?
After I press home on the opened chat screen, it gets minimized back to a chat head, and I can immediately reopen the chat screen. If the chat screen was an activity, then reopening the activity via startActivity(intent)
after the home button was pressed, would delay the start of the activity, as specified here:
Starting an activity from a service after HOME button pressed without the 5 seconds delay
and here: Reason for 5 sec delay to show an activity on pressing the home button?
in my service onCreate method, i use the following code to display a UI from service:
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);
}
....
}
Does anyone have an idea how can I receive the 'home button pressed' event directly from a service displaying a UI? I would like to minimize my view (similar to facebook chat heads) when the user presses the home button.
ok complete edit of my answer,
Override below method in your activity.
After overriding above method, now you can easily listen HOME Key press in your activity using onKeyDown() method.
try this hope it helps
You can monitor (e.g. check every 200 ms) the top running activity, and see if it is your activity or some other activity, and know when it changes. This will also let you handle cases like an incoming call.
You can add the category HOME to your manifest file.
You can achieve it by overriding View.onCloseSystemDialogs(). You may need to check View.java because this method is not visible in API doc.
Obviously, we can not detect 'Home button pressed' in general. In most cases, the window is created by startActivity(). And CloseSystemDialogs routine, which is caused by 'Home button pressed', is handled by internal class of android framework, PhoneWindow.DecorView as a view ancestor of ViewRootImpl. But when we add views to window manager directly, view ancestor of ViewRootImpl is being our custom view but PhoneWindow.DecorView. Checking the source code of ViewRootImpl.java might be easier to understand.
KeyEvent.KEYCODE_APP_SWITCH causes closeSystemDialogs routine, too. This explains how facebook chatheads works.
Here is working sample code.
well after doing my own research about that issue, I've came with the following conclusions:
Facebook "intercepting" the navigation buttons by providing the flag
TYPE_SYSTEM_OVERLAY
attribute. look on this post answer provided by @jawswaredoing what he advices not to do - will lead to the "affect" of controling the navigation buttons
using this flag provides focus on your overlay, and takes the focus from the activity behind.
with the
onFocusChangedListener
view callback or the OnKey listener they reacts to it with closing the full screen mode of the overlay.that's also explains how they reacts to it from the 3 navigation buttons - home / back / recent tasks