2015-12-26 34 views
9

我正在构建一个应用程序,该应用程序在某些事件上启动服务。该服务在每个应用程序顶部都有覆盖视图(如Facebook聊天头)。我想停止该服务,并在点击导航软键按钮(后退,家庭和最近的应用程序)时删除覆盖视图。检测具有窗口的服务中的导航按钮的触摸事件

我已经成功地通过扩展的RelativeLayout这是工作完全罚款作出了覆盖图。我正在关注覆盖视图this

同样的事情就是Facebook做了扩展和聊天头部的开闭。提前致谢。 :)作为陈述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)。我测试了这个解决方案,它为我工作。

所以,你可以调用stopService在onHomePressed()和onRecentAppsPressed()方法,然后覆盖的onDestroy()方法,在服务类,如下。

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

请尝试这些东西,让我们知道...好运气。

+0

它像一个魅力工作。非常感谢。 – Ajeet

3

我认为Facebook使用Activity。 可能当您单击浮动视图时,您将转到透明活动。

+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