2015-12-26 12 views
9

何らかのイベントでサービスを開始するアプリケーションを構築中です。このサービスには、(Facebookのチャットヘッドのような)すべてのアプリの上にオーバーレイビューがあります。私は、サービスを停止し、ナビゲーションソフトキーボタン(バック、自宅、最近のアプリ)のクリックでオーバーレイビューを削除したいと考えています。ウィンドウのあるサービス内のナビゲーションボタンのタッチイベントを検出する

私は正常に動作しているRelativeLayoutを拡張して、オーバーレイビューを作成しました。私はオーバーレイビューのためにthisに従っています。

Facebookと同じことが、チャットヘッドの拡張と閉鎖にあります。前もって感謝します。 :)

EDIT

私の問題は述べhereと同じです。

答えて

8

私はあなたと同じ問題に直面しました。だから、私はいくつかの日を研究した後、検出するためのクラスの下で見つかった(ホームと最近のアプリケーションキーの押されたイベント)。

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(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

上記のクラスをonCreateメソッドで以下のように使用してください。

@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(); 
} 

とプレスをバック検出するために、あなたは、このリンク(Service with Overlay - catch back button press)に従うことができます。私はこのソリューションをテストし、それは私のために働いた。

したがって、onHomePressed()およびonRecentAppsPressed()メソッドでstopServiceを呼び出し、次にサービスクラスのonDestroy()メソッドを次のようにオーバーライドできます。

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

これらのことを試してみてください...幸運を祈ってください。

+0

それは魅力的なように働いています。どうもありがとう。 – Ajeet

3

Facebookはアクティビティを使用していると思います。 おそらくフローティングビューをクリックすると、透過的なアクティビティに移動します。

+1

はい、アクティビティの問題は5秒遅れてしまうことです。http://stackoverflow.com/questions/5600084/starting-an-activity-from-a-service-after-home-button-pressed- without-the-5-seco – Ajeet

+0

リダイレクトアクティビティを試してみてください。このようなフローティングビュー - >リダイレクトアクティビティ - >アクティビティ。 –

+0

リダイレクト活動の解決策を詳しく教えてください。おかげで – Ajeet

関連する問題