检测具有 window 的服务内导航按钮的触摸事件
Detect touch event of navigation buttons inside a service having window
我正在构建一个在某些事件上启动服务的应用程序。该服务在每个应用程序(如 facebook 聊天头)的顶部都有一个叠加视图。我想停止服务并删除单击导航软键按钮(返回、主页和最近使用的应用程序)时的叠加视图。
我已经通过扩展 RelativeLayout 成功制作了一个覆盖视图,它工作得很好。我正在关注 this 以获取叠加视图。
同样的事情是Facebook 对聊天头的扩展和关闭。提前致谢。 :)
编辑
我的问题与here所述相同。
我认为 Facebook 使用 Activity。
可能当您单击浮动视图时,您会进入透明 activity。
我遇到了和你一样的问题。因此,在研究了几天之后,我发现下面的 class 用于检测(主页和最近应用程序键的按下事件)。
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 方法中使用上面 class 如下所示。
@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();
}
并且要检测后退压力,您可以遵循此 link()。我测试了这个解决方案,它对我有用。
因此您可以在 onHomePressed() 和 onRecentAppsPressed() 方法中调用 stopService,然后在您的服务 class 中覆盖 onDestroy() 方法,如下所示。
@Override
public void onDestroy() {
super.onDestroy();
mWindowManager.removeView(mYourOverlayView);
mHardwareKeyWatcher.stopWatch();
}
请尝试这些东西并告诉我们...祝您好运。
我正在构建一个在某些事件上启动服务的应用程序。该服务在每个应用程序(如 facebook 聊天头)的顶部都有一个叠加视图。我想停止服务并删除单击导航软键按钮(返回、主页和最近使用的应用程序)时的叠加视图。
我已经通过扩展 RelativeLayout 成功制作了一个覆盖视图,它工作得很好。我正在关注 this 以获取叠加视图。
同样的事情是Facebook 对聊天头的扩展和关闭。提前致谢。 :)
编辑
我的问题与here所述相同。
我认为 Facebook 使用 Activity。 可能当您单击浮动视图时,您会进入透明 activity。
我遇到了和你一样的问题。因此,在研究了几天之后,我发现下面的 class 用于检测(主页和最近应用程序键的按下事件)。
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 方法中使用上面 class 如下所示。
@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();
}
并且要检测后退压力,您可以遵循此 link(
因此您可以在 onHomePressed() 和 onRecentAppsPressed() 方法中调用 stopService,然后在您的服务 class 中覆盖 onDestroy() 方法,如下所示。
@Override
public void onDestroy() {
super.onDestroy();
mWindowManager.removeView(mYourOverlayView);
mHardwareKeyWatcher.stopWatch();
}
请尝试这些东西并告诉我们...祝您好运。