有没有办法听用户按下“主页”按钮?
我想覆盖“主页”按钮功能,但是我在很多地方都读到“出于安全原因,我们不能覆盖“主页”按钮”。我们可以覆盖“主页”按钮吗?
我尝试了各种代码段。我从以下站点获取了一个样本:
我在最新的Samsung J8 Phone中对其进行了测试,但无法正常工作。
答案 0 :(得分:1)
我的问题是我们可以覆盖主页按钮还是不能?
答案:自android 4.0起,您不能将主屏幕按钮改写为非系统应用。
但是有一些方法可以监听用户是否按下了主页按钮。如果您对此感兴趣,我会为您提供一些解决方案。
编辑:添加一些解决方案以监听主页按钮被按下。
我为您提供了两种方法来监听主页按钮按下事件。 首先,重新注册广播接收器。
class HomeKeyBroadCastReceiver extends BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
//press Home button
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
//press recent app button
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
// long press home button
final String SYSTEM_DIALOGS_REASON_LONG_PRESS_HOME_KEY = "globalactions";
@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) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
// press home , do something
} else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
// press recent app , do something
} else if (reason.equals(SYSTEM_DIALOGS_REASON_LONG_PRESS_HOME_KEY)) {
// long press home button , do something
}
}
}
}
}
// register Receiver
AppUtils.context.registerReceiver(homeKeyBroadCastReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
另一种方法,您可以在应用程序中注册生命周期回调。
application.registerActivityLifecycleCallbacks(new HomeButtonListerLifecycleCallbacks());
public class HomeButtonListerLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
// check threshold
private final int CHECK_DELAY = 200;
private Handler handler;
private Runnable checkRunnable;
public HomeButtonListerLifecycleCallbacks() {
this.handler = new Handler(Looper.getMainLooper());
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ZZLocalPushInfoManager.getInstance().onCreateActivity(activity);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
if (handler != null && checkRunnable != null) {
handler.removeCallbacks(checkRunnable);
}
}
@Override
public void onActivityPaused(final Activity activity) {
if (handler != null) {
if (checkRunnable != null) {
handler.removeCallbacks(checkRunnable);
}
handler.postDelayed(checkRunnable = new Runnable() {
@Override
public void run() {
// Here user has left your app. mostly they pressed home button,
// but they also can go to other app by notification,etc.
}
}, CHECK_DELAY);
}
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}