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 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 ответов
Удалить ваш ключевой слушатель или вернуться 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);
}
Просто сделай это..
@Override
public void onBackPressed() {
//super.onBackPressed();
}
комментирование //super.onBackPressed(); сделает свое дело
Я думаю, что вам нужно не переопределить кнопку "назад" (это не кажется хорошей идеей - ОС 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() {
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();
}
}
}
@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)
Похоже, я очень поздно, но для тех из вас, кому нужно переключиться на новый экран и очистить стек кнопок назад, это очень простое решение.
startActivity(new Intent(this,your-new-screen.class));
finishAffinity();
FinishAffinity(); очищает стек кнопки назад.
Просто сделай это
@Override
public void onBackPressed() {
super.onBackPressed();
}