在android中检测主页按钮

这一直在推动我一段时间的坚果。

有什么方法可靠地检测在android应用程序中是否按下了home按钮?

如果没有,那么是否有一种强有力的方式来说明导致活动进入onPause的原因? 即我们可以检测它是否是由新活动启动引起的,或者是通过按回/ home引起的。

我所看到的一个建议是重写onPause()并调用isFinishing(),但是如果按下home按钮,就会返回false,就像新活动开始时一样,所以无法区分这两者。

任何帮助非常感谢。

**更新**:感谢@ android-饿了这个链接:http://nisha113a5.blogspot.com/

包含以下方法:

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);           
}

然后,下列事件将被触发以进行主页按钮按压:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     

    if(keyCode == KeyEvent.KEYCODE_HOME)
    {
       //The Code Want to Perform. 
    }
});

我不确定这条线是否有任何副作用:

this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);   

所以,与流行的看法相反,你实际上可以听取家庭钥匙。 令人担忧的是,您可以返回false并让主键不执行任何操作。

更新:正如预期的那样,这会带来一些副作用 - 在启用此模式后,嵌入的视频和Google地图似乎不可见。

更新:据说这个黑客不再适用于Android 4.0以上版本


以下代码适用于我:)

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class HomeWatcher {

    static final String TAG = "hg";
    private Context mContext;
    private IntentFilter mFilter;
    private OnHomePressedListener mListener;
    private InnerRecevier mRecevier;

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

    public void setOnHomePressedListener(OnHomePressedListener listener) {
        mListener = listener;
        mRecevier = new InnerRecevier();
    }

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

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

    class InnerRecevier extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
        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.onHomeLongPressed();
                        }
                    }
                }
            }
        }
    }
}
public interface OnHomePressedListener {
    public void onHomePressed();

    public void onHomeLongPressed();
}

这是一个古老的问题,但它可能有助于某人。

@Override
protected void onUserLeaveHint()
{
    Log.d("onUserLeaveHint","Home button pressed");
    super.onUserLeaveHint();
}

根据文档,onUserLeaveHint()方法在用户单击主页按钮或当某个事件中断您的应用程序时(如来电)调用。

这对我有用.. :)


从Android应用内检测和/或拦截HOME按钮是不可能的。 这是内置于系统中以防止无法退出的恶意应用程序。

链接地址: http://www.djcxy.com/p/26167.html

上一篇: Detect home button press in android

下一篇: Android: Preventing going back to the previous activity