Android: привязать метод к домашней кнопке смартфона

1

как я могу связать метод с домашней кнопкой смартфона? Я хочу, чтобы проверка этого botton моего приложения для Android выполняла определенный метод. Я прочитал, что для отключения домашней кнопки существует метод:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

но это не полезно для меня. Как я могу решить эту проблему?

  • 0
    вы не можете, потому что это изменило бы стандартное поведение телефона Android
  • 0
    Я хочу, чтобы, когда пользователь использует мое приложение, нажимал кнопку «Домой», выход из моего приложения
Теги:
home-button

2 ответа

2
Лучший ответ

Используйте этот код:

HomeWatcher mHomeWatcher = new HomeWatcher(this);
mHomeWatcher.setOnHomePressedListener(new OnHomePressedListener() {
    @Override
    public void onHomePressed() {
        // do something here...
    }
    @Override
    public void onHomeLongPressed() {
    }
});
mHomeWatcher.startWatch();

HomeWatcher:

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

OnHomePressedListener:

public interface OnHomePressedListener {
    public void onHomePressed();

    public void onHomeLongPressed();
}
  • 0
    Спасибо @Alexander. Это работает и лучшее решение
  • 0
    это бросает "Активность утекла IntentReceiver HomeWatcher $ InnerReceiver @ 2a49226, который был первоначально зарегистрирован здесь. Вы пропустили вызов unregisterReceiver ()", как решить эту ошибку ????
Показать ещё 1 комментарий
0

Попробуйте переопределить onKeyDown как таковой:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HOME)
        // do what you need
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню