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;
}
однако приведенный выше код по-прежнему позволяет уничтожить мою активность, как я могу остановить ее уничтожение, когда кнопка " Назад нажал?
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(); сделает трюк
на всякий случай, если вы хотите обработать поведение кнопки "Назад" (в нижней части телефона) и кнопки "Домой" (слева от панели действий), это пользовательское действие, которое я использую в своем проекте, может вам помочь.
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