Android-как переопределить кнопку "Назад", чтобы она не завершала() мою деятельность?



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



это делается для того, чтобы, когда пользователь нажимает home и активность выталкивается на задний план, они могут вернуться к активности через уведомление.



проблема возникает, когда пользователь нажимает кнопку "назад", моя активность уничтожается, но уведомление остается, поскольку я хочу, чтобы пользователь мог нажать назад, но все же смог добраться до деятельность через уведомление. Но когда пользователь пытается это сделать, я получаю нулевые указатели, поскольку он пытается начать новую деятельность, а не возвращать старую.



поэтому по существу я хочу, чтобы кнопка "назад" действовала точно так же, как кнопка "Домой", и вот как я пытался до сих пор:





        @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;
}




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

681   6  

6 ответов:

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

вам просто нужно следующее, Чтобы поймать ключ назад (убедитесь, что не звоните супер на 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);
}

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

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}

Я думаю, что вы хотите не переопределять кнопку "назад" (это просто не кажется хорошей идеей - ОС Android определяет это поведение, зачем его менять?), но использовать Жизненный Цикл Активности и сохраняйте свои настройки / данные в 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
}

смотрим выше псевдо-код, чтобы указать вам в правильном направлении. Чтение на Жизненный Цикл Активности должен помочь вам определить лучший способ для достижения того, что вы ищете.

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

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

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

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

@Override
public void onBackPressed() {
    finish();
}

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

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

Comments

    Ничего не найдено.