在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