Détecter " bouton home enfoncé en android service de l'affichage d'une INTERFACE utilisateur (similaire à facebook chatheads)
Dans facebook chatheads, qui font partie de l'facebook messenger app, j'ai remarqué que le comportement suivant:
Aussi loin que je peux voir, le chat de la tête elle-même et l'ouverture de la fenêtre de discussion de toutes les pièces d'un service. Aucune activité n'est impliqué.
Comment puis-je en être sûr?
Après j'maison de presse sur l'ouverture d'un écran de chat, il se réduit à dos une tête de chat, et je peux rouvrir immédiatement l'écran de chat. Si l'écran de chat est une activité, puis la réouverture de l'activité via startActivity(intent)
après la maison de bouton a été pressé, serait de retarder le début de l'activité, comme indiqué ici:
Le démarrage d'une activité à partir d'un service après bouton HOME enfoncé sans retard de 5 secondes
et ici: Raison pour 5 sec de retard de montrer une activité en appuyant sur le bouton home?
dans mon service méthode onCreate, j'utilise le code suivant pour afficher une INTERFACE utilisateur de 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);
}
....
}
Quelqu'un a une idée de comment puis-je recevoir le bouton "accueil pressé' événement directement à partir d'un service de l'affichage d'une INTERFACE utilisateur? Je voudrais réduire ma vue (similaire à facebook chat heads) lorsque l'utilisateur appuie sur le bouton home.
- J'ai été supprised de voir que vous avez droit. J'ai fait ma propre expérience, et en effet l'activité qui était en forgreound n'est pas en pause lorsque les messages popup ouvert => ce qui prouve qu'aucune nouvelle activité. Je vais faire mes recherches, comment est-ce possible. c'est en effet intéressant
- Merci! en espérant que votre recherche sera mieux la mienne alors...
- Notons en passant qu'ils ont aussi attraper les tâches récentes bouton, si c'est d'une quelconque aide.
- Comment voulez-vous commencer votre service?
- En utilisant
startService(new Intent(this, ServiceTest.class)
à partir d'une activité, mais je peux aussi commencer par la liaison à partir d'une activité. Comment est-ce pertinent? - Vous pouvez écouter aux actions de l'utilisateur à partir de cette activité
- J'utilise startService, et l'appel de l'activité n'est pas garanti pour rester en vie. Et comme mentionné dans mon post et @Tal Kanel commentaire, le facebook chathead fonctionnalité n'utilisez pas une activité pour détecter le bouton home enfoncé événement.
Vous devez vous connecter pour publier un commentaire.
bien après avoir fait mes propres recherches sur la question, je suis venu avec les conclusions suivantes:
Facebook "intercepter" les boutons de navigation en fournissant le drapeau
TYPE_SYSTEM_OVERLAY
attribut. regarde sur le ce post réponse fournie par @jawswarefaire ce qu'il a des conseils à ne pas faire, va conduire à la "touche" de contrôle sur les boutons de navigation
l'aide de cet indicateur met l'accent sur votre superposition, et prend l'accent de l'activité derrière.
avec le
onFocusChangedListener
vue de rappel ou la OnKey auditeur ils réagit avec la fermeture du mode plein écran de la superposition.qui explique aussi comment ils ont réagit à partir du 3 boutons de navigation - accueil /retour /tâches récentes
TYPE_SYSTEM_OVERLAY
et la vérification de la onFocusChanged événement, mais la fenêtre du service à la vue refusé de recevoir le focus. L'accent est resté sur la fenêtre sous-jacente. J'ai aussi essayé de l'utiliser avec lesFLAG_WATCH_OUTSIDE_TOUCH
, mais il n'a pas aidé. Vous avez essayé et réussi à le faire fonctionner?FLAG_NOT_FOCUSABLE
. Ne fonctionne toujours pas.Vous pouvez l'atteindre par substitution de Vue.onCloseSystemDialogs(). Vous pouvez avoir besoin de vérifier View.java parce que cette méthode n'est pas visible dans la doc API.
Évidemment, on ne peut pas détecter la Maison de bouton enfoncé " en général. Dans la plupart des cas, la fenêtre est créée par startActivity(). Et CloseSystemDialogs de routine, qui est causée par la Maison de bouton pressé", est gérée par une classe interne d'android cadre, PhoneWindow.DecorView qu'une vue de l'ancêtre de ViewRootImpl. Mais quand on ajoute des points de vue de gestionnaire de fenêtre directement, vue ancêtre de ViewRootImpl est notre point de vue, mais PhoneWindow.DecorView. Vérifier le code source de ViewRootImpl.java peut-être plus facile à comprendre.
KeyEvent.KEYCODE_APP_SWITCH causes closeSystemDialogs routine, trop. C'est ce qui explique comment facebook chatheads œuvres.
ok complète de modifier ma réponse,
Remplacer méthode ci-dessous dans votre activité.
Après substituant la méthode ci-dessus, maintenant, vous pouvez facilement écouter la Clé de la MAISON de la presse dans votre activité à l'aide onKeyDown() la méthode.
essayer cette espère que cela aide
WindowManager.LayoutParams.TYPE_PHONE
àWindowManager.LayoutParams.TYPE_KEYGUARD
, j'obtiens l'exception suivante: Impossible d'ajouter de la fenêtre de android.vue.ViewRootImpl$W@b3010920 -- le refus d'une autorisation pour ce type de fenêtreThis key is handled by the framework and is never delivered to applications.
Vous pouvez surveiller (par exemple, vérifier toutes les 200 ms) au sommet de l'exécution de l'activité, et de voir si il est votre activité ou une autre activité, et de savoir quand il change.
Cela vous permettra aussi de gérer les cas comme un appel entrant.
android.permission.GET_TASKS
. Si yo regarder le facebook messenger application des autorisations, vous pouvez le voir, ils ne l'utilisent pas. Ce n'est donc pas la technique de facebook chathead est à l'aide.C'est ma voie. Il fonctionne bien. Mettre dans onReceive() fonction.
Je suis assez sûr que facebook n'écoute pas, pour la maison on appuie sur un bouton, parce que leur logique exige que le chat têtes de à se manifester indépendamment de ce que l'application est visible, tant qu'il n'est pas facebook.
Un moyen simple et efficace pour ce faire serait de maintenir un statique drapeau
visible
dans votre Application singleton, et de le modifier à partir de toutes les Activités que vous avez. Dans le onPause(), ilfalse
, et dans onResume() et onCreate() set àtrue
.Puis il suffit de vérifier l'état de cet indicateur, et d'agir en conséquence. Si c'est vrai, cela signifie que votre application est visible.
Vous voudrez peut-être ajouter une petite pause avant d'agir sur elle pour éviter que votre injecté points de Vue à partir de scintillement chaque fois qu'une Activité est changé.
onPause()
etonResume()
.Voici de travail exemple de code.
Vous pouvez ajouter la catégorie MAISON à votre fichier manifeste.