Установить первый экран в качестве текущего элемента на панели запуска, когда пользователь нажимает кнопку «Домой»?

Я создаю приложение для замены лаунчера/начального экрана и заметил, что все лаунчеры позволяют пользователю нажать кнопку «Домой», чтобы перейти к первому экрану лаунчера. Таким образом, очевидно, что можно прослушивать домашний ключ для приложений, заменяющих дом, но я не смог понять, как это сделать.

Как я могу прослушивать клавишу «домой» и запускать setCurrentItem(0), когда пользователь нажимает «домой», находясь внутри моей панели запуска?

РЕДАКТИРОВАТЬ

У меня пока два варианта:

@Override
public void onPause() {
    super.onPause();

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    if(!this.isFinishing())
    {
        if (sharedPrefs.getBoolean("user_called", false))
        {
            // Si fue por una llamada del usuario eliminar bandera y no hacer nada
            Utils.setUserCalled(getApplicationContext(), false);
        }
        else
        {
            mPager.setCurrentItem(0);
        }
    }
}

Другой метод таков:

Boolean appState = false;

@Override
public void onPause() {
    super.onPause();
    appState = false;
}

@Override
public void onResume() {
    super.onResume();

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    if(!appState)
    {
        if (sharedPrefs.getBoolean("user_called", false))
        {
            // Si fue por una llamada del usuario eliminar bandera y no hacer nada
            Utils.setUserCalled(getApplicationContext(), false);
        }
        else
        {
            mPager.setCurrentItem(0);
        }
    }
}

Оба используют флаг с именем user_call, чтобы знать, начал ли пользователь вызов. Моя проблема сейчас в том, что оба метода не работают, когда звонит телефон. Есть ли способ отфильтровать эти случаи?


person lisovaccaro    schedule 08.01.2015    source источник
comment
вы можете посмотреть на это scriptedpapers.com/2013/07/26/   -  person Angel Koh    schedule 08.01.2015


Ответы (5)


Вы не можете прослушать нажатие кнопки «Домой», так как это системное событие и не доставляется в приложения. Это описано в документации здесь, а также видно из Коды Android здесь. Идея проста — вы не должны иметь возможности написать приложение, которое захватит телефон. Вы можете «сломать» функциональность кнопки «Назад», но не функциональность кнопки «Домой».

Что обычно делают сторонние программы запуска, так это в первую очередь объявляют режим запуска активности программы запуска как singleInstance в манифесте: android:launchMode="singleInstance". Затем, в дополнение к переопределению onCreate(), вы также переопределяете onNewIntent(). Обычно он вызывается вместо onCreate(), когда активность уже запущена, но кто-то загорелся намерением запустить ее снова. В случае запуска он будет вызываться, когда ваш модуль запуска уже запущен, но система запускает намерение запустить его, потому что пользователь нажал кнопку «Домой». В этой функции вы можете перейти на «домашнюю» страницу по умолчанию.

person frangulyan    schedule 17.01.2015

У меня работает Ovverriding onUserLeaveHint() — я могу совершать действия, как только пользователь уходит, используя кнопку «Домой», и не вызывается при входящих звонках.

Не знаю, будет ли это работать с домашним занятием.

@Override
public void onUserLeaveHint() {
    super.onUserLeaveHint();
    mPager.setCurrentItem(0);
}
person natario    schedule 12.01.2015

isFinishing() 

возвращает TRUE, когда действие должно быть завершено или уничтожено.

isFinishing() 

возвращать FALSE, когда активность переходит в фоновый режим.

@Override
protected void onPause() {

    super.onPause();
    if (!this.isFinishing()){

        //Insert code for HOME  key Event
    }
}
person xXJJJasonMokXx    schedule 10.01.2015
comment
привет, это работает, однако я не уверен, как отличить, когда пользователь нажимает кнопку «Домой» и когда совершается вызов - person lisovaccaro; 12.01.2015

Конечно, вы можете использовать OnPause(), но вы также можете попробовать это:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {     
    if(keyCode == KeyEvent.KEYCODE_HOME) {
        //do things
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
person Shalva Avanashvili    schedule 15.01.2015

Как отмечалось в предыдущих ответах, вы можете перехватить событие нажатия домашней клавиши. Однако это будет работать только тогда, когда ваше приложение запущено (т. е. отображается на экране).

Но если я вас правильно понял, вы на самом деле хотите чего-то другого. Вы создаете собственный лаунчер, поэтому хотите, чтобы Android запускал ваше приложение при нажатии кнопки «Домой». Для этого вам необходимо правильно настроить файл AndroidManifest.xml.

Вот полное пошаговое руководство, как создать пользовательское приложение для запуска. Раздел 3 содержит подробное описание того, как зарегистрировать ваше приложение в качестве лаунчера.

http://code.tutsplus.com/tutorials/build-a-custom-launcher-on-android--cms-21358

person Igor Gorjanc    schedule 15.01.2015