Detectair o evento 'button inicial pressionado' no service Android exibindo uma interface do user (semelhante ao Facebook chatheads)

No Facebook chatheads, que fazem pairte do aplicativo do Facebook Messenger, notei o seguinte comportamento: tanto quanto eu posso view, o próprio header de conviewsa e a canvas de bate-papo aberta são pairtes de um service. Nenhuma atividade está envolvida.

Como posso ter certeza? Depois de pressionair a casa na canvas de bate-papo aberta, ela é minimizada de volta paira uma cabeça de bate-papo, e eu posso reabrir imediatamente a canvas de bate-papo. Se a canvas do bate-papo fosse uma atividade, a reabertura da atividade via stairtActivity(intent) após o pressionamento do button inicial atrasairia o início da atividade, como especificado aqui: Iniciando uma atividade de um service depois do button HOME pressionado sem os 5 segundos demora

  • O Eclipse está tentando build os files em meus diretórios .svn ... como posso dizer paira pairair?
  • O atributo xml singleLine está reprovado ou não no Android?
  • Como obter o context da minha atividade?
  • Android StringBody (String) está obsoleto
  • Qual é o propósito de Gradle?
  • Fragment getArguments () retorna nulo
  • e aqui: Razão paira o atraso de 5 segundos paira mostrair uma atividade ao pressionair o button inicial?

    No meu service onCreate method, uso o código a seguir paira exibir uma UI do service:

     public class ServiceTest extends Service { ... @Oviewride public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.TYPE_PHONE, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); windowManager.addView(someView, pairams); } .... } ... public class ServiceTest extends Service { ... @Oviewride public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.TYPE_PHONE, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); windowManager.addView(someView, pairams); } .... } } public class ServiceTest extends Service { ... @Oviewride public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.WRAP_CONTENT, WindowManager.LayoutPairams.TYPE_PHONE, WindowManager.LayoutPairams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); windowManager.addView(someView, pairams); } .... } 

    Alguém tem uma idéia de como posso receber o evento 'button inicial pressionado' diretamente de um service que exibe uma IU? Gostairia de minimizair a minha visão (semelhante às cabeças de bate-papo do Facebook) quando o user pressiona o button inicial.

  • Como limitair o alto da exibição suspensa do Spinner no Android
  • Android Layer-List VectorDrawable tamanho
  • Mude o ícone da bairra de status da notificação push no Android e IOS
  • Cairregando resources de image como RGB 565
  • Android: faça uma exibição personalizada rolável
  • Coloque qualquer visualização em um VideoView no Android
  • 8 Solutions collect form web for “Detectair o evento 'button inicial pressionado' no service Android exibindo uma interface do user (semelhante ao Facebook chatheads)”

    bem depois de fazer minha própria search sobre essa questão, cheguei com as seguintes conclusões:

    Facebook "interceptando" os botões de navigation, fornecendo o atributo TYPE_SYSTEM_OVERLAY da bandeira. Olhe nesta resposta de post fornecida por @jawswaire

    fazendo o que ele sugere paira não fazer – levairá ao "efeito" de controlair os botões de navigation

    Usair esta bandeira fornece foco na sua sobreposition, e tira o foco da atividade por trás.

    com o callback onFocusChangedListener View ou o ouvinte OnKey, eles reagem a ele ao fechair o modo de canvas cheia da sobreposition.

    Isso também explica como eles reagem a ele a pairtir dos 3 botões de navigation – tairefas domésticas / atrasadas / recentes

    Você pode alcançá-lo substituindo View.onCloseSystemDialogs (). Talvez seja necessário viewificair View.java porque esse método não está visível no doc API.

    Obviamente, não podemos detectair o 'button Início pressionado' em geral. Na maioria dos casos, a window é criada por stairtActivity (). E a rotina CloseSystemDialogs, que é causada pelo "button Home pressionado", é tratada pela class interna do framework Android, PhoneWindow.DecorView como um antepassado de ViewRootImpl. Mas quando adicionamos vistas diretamente ao gerenciador de windows, view o antepassado de ViewRootImpl é nossa visão personalizada, mas PhoneWindow.DecorView. Verificair o código-fonte do ViewRootImpl.java pode ser mais fácil de entender.

    KeyEvent.KEYCODE_APP_SWITCH causa rotina closeSystemDialogs, também. Isso explica como o chatheads do Facebook funciona.

    Você pode monitorair (por exemplo, viewificair a cada 200 ms) a atividade de execução superior e view se é sua atividade ou alguma outra atividade e saber quando ela muda. Isso também permitirá que você lida com casos como uma chamada recebida.

     ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE); am.getRunningTasks(1).get(0).topActivity... 

    ok, edição completa da minha resposta,

    Substitua o método abaixo em sua atividade.

      @Oviewride public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutPairams.TYPE_KEYGUARD); } 

    Depois de replace o método acima, agora você pode ouvir facilmente a tecla HOME pressionando em sua atividade usando o método onKeyDown ().

      @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); public boolean onKeyDown (int keyCode, evento KeyEvent) {  @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); {  @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); }  @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } }); 

    tente essa esperança, isso ajuda

    Esse é meu jeito. Funciona bem. Coloque-a na function onReece ().

     if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } } if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } { if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } } if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } } if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_REASON); //Toast.makeText(context,"ACTION_CLOSE_SYSTEM_DIALOGS : Reason : " + reason ,Toast.LENGTH_LONG).show(); // Detect home screen key press or "recent app" key pressed when screen is in unlocked state if (reason != null) { if (reason.equals(SYSTEM_HOME_KEY)) { // For Home press } else if (reason.equals(SYSTEM_RECENT_APPS)) { // For long press } } } 

    Estou bastante certo de que o Facebook não escuta as pressões do button de casa, porque sua lógica exige que as cabeças de bate-papo apaireçam independentemente do aplicativo visível, desde que não seja o Facebook.

    Uma maneira simples e grosseira de fazer isso seria manter uma bandeira estática visible em seu aplicativo Singleton e modificá-la de todas as atividades que você tiview. No onPause (), defina-o como false , e no onResume () e onCreate () configure-o paira true .

    Em seguida, basta viewificair o estado desta bandeira e agir em conformidade. Se for viewdade, isso significa que seu aplicativo está visível.

    Você pode querer adicionair uma pequena pausa antes de agir sobre isso paira evitair que suas visualizações injetadas cintilem cada vez que uma atividade é alterada.

    Aqui está trabalhando o código de exemplo.

     mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); } mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); || mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); || mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); || mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); } mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); } mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); }; mLineair = new LineairLayout(getApplicationContext()) { //home or recent button public void onCloseSystemDialogs(String reason) { //The Code Want to Perform. } @Oviewride public boolean dispatchKeyEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN || event.getKeyCode() == KeyEvent.KEYCODE_CAMERA ) { //The Code Want to Perform. } return super.dispatchKeyEvent(event); } }; mLineair.setFocusable(true); View mView = inflate.inflate(R.layout.floating_panel_layout, mLineair); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); //pairams WindowManager.LayoutPairams pairams = new WindowManager.LayoutPairams( width, height, WindowManager.LayoutPairams.TYPE_SYSTEM_ALERT, WindowManager.LayoutPairams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutPairams.FLAG_FULLSCREEN | WindowManager.LayoutPairams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutPairams.FLAG_KEEP_SCREEN_ON, PixelFormat.TRANSLUCENT); pairams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; wm.addView(mView, pairams); 

    Você pode adicionair a categoria HOME ao seu file de manifesto.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.