Android - Как переопределить кнопку «Назад», чтобы она не заканчивала () мою активность? - PullRequest
183 голосов
/ 29 июня 2010

В настоящее время у меня есть действие, при котором уведомление отображается также на панели уведомлений.

Это так, что когда пользователь нажимает на кнопку домой, а действие переходит в фоновый режим, они могут вернуться к действию через уведомление.

Проблема возникает, когда пользователь нажимает кнопку «Назад», моя активность уничтожается, но уведомление остается, поскольку я хочу, чтобы пользователь мог нажимать назад, но при этом получать доступ к активности через уведомление. Но когда ПОЛЬЗОВАТЕЛЬ пытается это сделать, я получаю Null Pointers, поскольку он пытается начать новую деятельность, а не возвращать старую.

Итак, я хочу, чтобы кнопка «Назад» действовала точно так же, как кнопка «Домой», и вот как я пытался это сделать:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

Однако приведенный выше код по-прежнему позволяет уничтожить мою активность. Как я могу остановить уничтожение моей активности при нажатии кнопки «Назад»?

Ответы [ 7 ]

253 голосов
/ 29 июня 2010

Удалите ваш ключевой слушатель или верните true, когда у вас есть KEY_BACK.

Вам просто нужно следующее, чтобы перехватить клавишу возврата (Убедитесь, что не вызываете super in onBackPressed()).

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

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (Integer.parseInt(android.os.Build.VERSION.SDK) > 5
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        Log.d("CDA", "onKeyDown Called");
        onBackPressed();
        return true; 
    }
    return super.onKeyDown(keyCode, event);
}


@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}
65 голосов
/ 24 апреля 2015

Это было проще реализовать только с одной строкой кода:

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}
12 голосов
/ 29 июня 2010

Я думаю, что вам нужно не переопределить кнопку возврата (это не кажется хорошей идеей - ОС Android определяет такое поведение, зачем его менять?), А использовать Activity Lifecycle и сохраните ваши настройки / данные в событии onSaveInstanceState (Bundle) .

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

Затем вы используете onCreate (Bundle) , чтобы извлечь все из того, что осталосьсвязать и воссоздать ваше состояние.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

Рассмотрите приведенный выше псевдо-код, чтобы указать вам правильное направление.Ознакомление с Activity Lifecycle должно помочь вам определить лучший способ выполнить то, что вы ищете.

10 голосов
/ 18 мая 2016

просто сделайте это ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

комментируя //super.onBackPressed ();сделает свое дело

3 голосов
/ 08 мая 2017

Попробуйте это:

@Override
public void onBackPressed() {
    finish();
}
2 голосов
/ 25 июля 2017

На всякий случай, если вы хотите обработать поведение кнопки «Назад» (внизу телефона) и кнопки «Домой» (слева от панели действий), это пользовательское действие я использую в своем проекте может помочь вам.

import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

Пример использования в вашей деятельности:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}
0 голосов
/ 09 января 2019
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)
...