【问题标题】:Detect touch event of navigation buttons inside a service having window检测具有窗口的服务内导航按钮的触摸事件
【发布时间】:2015-12-26 12:33:30
【问题描述】:

我正在构建一个在某些事件上启动服务的应用程序。该服务在每个应用程序(如 facebook 聊天头)之上都有一个覆盖视图。我想停止服务并在点击导航软键按钮(返回、主页和最近使用的应用程序)时删除覆盖视图。

我已经通过扩展 RelativeLayout 成功地制作了一个覆盖视图,它工作得很好。我正在关注 this 以获取叠加视图。

Facebook 也在做同样的事情来扩展和关闭聊天头。提前致谢。 :)

编辑

我的问题与here 所述相同。

【问题讨论】:

    标签: android service live-wallpaper homescreen


    【解决方案1】:

    我遇到了和你一样的问题。因此,在研究了几天后,我发现下面的类用于检测(按下 home 事件和最近的应用程序键)。

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

    请尝试这些事情并告诉我们...祝你好运。

    【讨论】:

    • 你为我节省了很多时间。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 是的,但是活动的问题是它会延迟 5 秒 stackoverflow.com/questions/5600084/…
    • 请尝试使用重定向活动。像这个浮动视图 -> 重定向活动 -> 活动。
    • 您能否详细说明您的重定向活动解决方案?谢谢
    • 重定向活动非常简单。请将startActivity()finish() 放入onCreate() 重定向活动中。
    • 重定向活动如何帮助您解释一下?因为开始第一个活动可能需要 5 秒才能开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多