2015-12-26 21 views
9

Ich baue eine App, die einen Dienst bei einem Ereignis startet. Der Service hat eine Overlay-Ansicht über jeder App (wie Facebook Chat-Kopf). Ich möchte den Dienst beenden und die Überlagerungsansicht beim Klicken auf die Navigationstasten entfernen (Zurück, Startseite und zuletzt verwendete Apps).Erkennen Touch-Ereignis von Navigationstasten in einem Dienst mit Fenster

Ich habe erfolgreich eine Overlay-Ansicht gemacht, indem ich RelativeLayout erweitert habe, was völlig in Ordnung ist. Ich folge this für Overlay-Ansicht.

Dasselbe tut Facebook, um den Chat-Kopf zu erweitern und zu schließen. Danke im Voraus. :)

EDIT

Mein Problem ist das gleiche wie here angegeben.

Antwort

8

Ich hatte das gleiche Problem wie Sie. Nachdem ich einige Tage recherchiert hatte, fand ich unterhalb der Klasse für die Erkennung (gedrücktes Ereignis von Home- und recentapps-Schlüsseln).

public class HardwareKeyWatcher { 
    static final String TAG = "HardwareKeyWatcher"; 
    private Context mContext; 
    private IntentFilter mFilter; 
    private OnHardwareKeysPressedListener mListener; 
    private InnerReceiver mReceiver; 


    public interface OnHardwareKeysPressedListener { 
     public void onHomePressed(); 

     public void onRecentAppsPressed(); 
    } 

    public HardwareKeyWatcher(Context context) { 
     mContext = context; 
     mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
     mFilter.setPriority(1000); 
    } 

    public void setOnHardwareKeysPressedListenerListener(OnHardwareKeysPressedListener listener) { 
     mListener = listener; 
     mReceiver = new InnerReceiver(); 
    } 

    public void startWatch() { 
     if (mReceiver != null) { 
      mContext.registerReceiver(mReceiver, mFilter); 
     } 
    } 

    public void stopWatch() { 
     if (mReceiver != null) { 
      mContext.unregisterReceiver(mReceiver); 
     } 
    } 

    class InnerReceiver extends BroadcastReceiver { 
     final String SYSTEM_DIALOG_REASON_KEY = "reason"; 
     final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; 
     final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { 
       String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); 
       if (reason != null) { 
        Log.e(TAG, "action:" + action + ",reason:" + reason); 
        if (mListener != null) { 
         if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { 
          mListener.onHomePressed(); 
         } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { 
          mListener.onRecentAppsPressed(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Verwenden Sie die oben genannte Klasse in der OnCreate-Methode in Ihrem Service.

@Override 
public void onCreate() { 
mHardwareKeyWatcher = new HardwareKeyWatcher(this); 
     mHardwareKeyWatcher.setOnHardwareKeysPressedListenerListener(new HardwareKeyWatcher.OnHardwareKeysPressedListener() { 
      @Override 
      public void onHomePressed() { 
       System.out.println("stop your service here"); 
      } 

      @Override 
      public void onRecentAppsPressed() { 
       System.out.println("stop your service here"); 
      } 
     }); 
mHardwareKeyWatcher.startWatch(); 
} 

und zum Erfassen drücken zurück Sie diesem Link folgen können (Service with Overlay - catch back button press). Ich habe diese Lösung getestet und es hat für mich funktioniert.

So können Sie stopService in onHomePressed() und onRecentAppsPressed() -Methoden aufrufen und dann OnDestroy() -Methode in Ihrer Serviceklasse wie folgt überschreiben.

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mWindowManager.removeView(mYourOverlayView); 
    mHardwareKeyWatcher.stopWatch(); 
} 

Bitte versuchen Sie diese Dinge und lassen Sie uns wissen ... viel Glück.

+0

Es funktioniert wie ein Charme. Danke vielmals. – Ajeet

3

Ich denke Facebook verwendet Aktivität. Wahrscheinlich, wenn Sie auf die schwebende Ansicht klicken, wechseln Sie zur transparenten Aktivität.

+1

Ja, aber das Problem mit der Aktivität ist, dass es um 5 Sekunden verzögert erhalten http://stackoverflow.com/questions/5600084/starting-an-activity-from-a-service-after-home-button-pressed- ohne-the-5-seco – Ajeet

+0

Bitte versuchen Sie Redirect-Aktivität. Wie diese Schwimmdock Ansicht -> Umleitung Aktivität -> Aktivität. –

+0

Können Sie bitte Ihre Lösung der Umleitungsaktivität ausarbeiten? Danke – Ajeet