2013-03-13 3 views
103

У меня есть основной вид деятельности, что, когда я нажимаю на кнопку, начинает новую деятельность, я использовал следующий код, чтобы сделать это:Как закрыть деятельность и вернуться к прежней деятельности в андроида

Intent intent = new Intent(this, SettingsActivity.class); 
startActivity(intent); 

Вышеупомянутый код запускался из основного вида деятельности.

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

Я пробовал звонить super.finish() и только finish() (из новой активности), но это закрывает все мое приложение (включая мое основное действие).

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

EDITED

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


ОК Я смотрел,

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

Для настроек Действия, когда я нажимаю кнопку «Назад», возвращается в основное действие.

С видом деятельности, упомянутой выше в главном вопросе, он просто выходит из моего приложения.

Таким образом, проблема не в том, что код завершает работу, а сам процесс.

+4

Вам даже не нужна кнопка «Назад», просто позвольте пользователю использовать ключ телефона назад, и вам не нужно ничего делать. –

+0

Кнопка «Назад» закрывает приложение ввода, а не только мою второстепенную активность. Я не хочу закрывать основное мероприятие. – Zapnologica

+1

Кнопка «Назад» не должна делать этого - можете ли вы показать больше своего кода? – peejaybee

ответ

154

Я думаю, что вы вызываете метод finish() в MainActivity перед началом SettingsActivity.

сценарий, который вы описали будет происходить в двух следующих способов:

ЯВНО

Вы установили android:noHistory = "true" для MainActivity внутри AndroidManifest.xml, которая вызывает MainActivity к finish автоматически при нажатии на клавишу возврата.

ИЛИ

Перед включением в свой 'SettingsActivity', вы назвали finish() в вашем MainActivity, который убивает его.Когда вы нажимаете кнопку «Назад», поскольку никакая другая активность не задана в стеке, она возвращается на главный экран.

+0

Это объясняет, почему кнопка «назад» телефона также отклоняет основное действие. – peejaybee

+0

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

+0

Я сделал это столетие, не нужно благодарить, хотя @TGMCians –

1

Только не называйте finish() на вашем MainActivity то это устраняет необходимость переопределять onBackPressed() в вашем SecondActivity, если вы не делаете другие вещи в этой функции. Если вы чувствуете «необходимость» для этой кнопки возврата, то вы можете просто позвонить finish() на SecondActivity и что приведет вас к вашим MainActivity до тех пор, пока вы не называли finish() на это

+0

Я пробовал этот маршрут, но у меня примерно 10 экранов, в которых используются PNG с высоким разрешением. Проблема в том, что примерно на экране 7 устройство выходит из памяти из-за всех действий в back-stack. Я решил назвать финиш на каждом мероприятии, и это устранило проблему, разрешив сбор мусора, но теперь обратное поведение требует кодирования вручную, потому что back-stack теперь пуст. Вы столкнулись с этой проблемой или знаете какие-либо механизмы в Android, чтобы решить эту проблему? –

+0

Что вы хотите сделать с помощью кнопки «Назад»? Вернитесь к тому, что было в предыдущей «Деятельности», или всегда возвращайтесь к «MainActivity»? Кроме того, если у вас заканчивается память с помощью битмапов, вы должны прочитать [Эта часть документов] (http://developer.android.com/training/displaying-bitmaps/load-bitmap.html). Это помогло мне – codeMagic

+0

@ Lo-Tan, если вы хотите вернуться к предыдущей деятельности, тогда я думаю, вам нужно выяснить управление памятью для ваших изображений и не завершить работу (возможно, со ссылкой, которую я предоставил).В противном случае вам придется воссоздать новый экземпляр действия и попытаться выяснить, какой из них следует вернуться к – codeMagic

4
Button edit = (Button) view.findViewById(R.id.yourButton); 
edit.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(this, YourMainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 
}); 
4

Это закрывает все приложения:

this.finish(); 
+0

Закрывает все приложение, как указано в вопросе, а не только о текущей деятельности, Как и кнопка возврата телефона? – Zapnologica

+0

Как получить предыдущую активность от активности камеры. – Chip

2

Вы делаете это слишком сложно. Если я пойму, что вы пытаетесь сделать правильно, встроенная кнопка «назад» и сам Android будут делать всю работу за вас: http://developer.android.com/guide/components/tasks-and-back-stack.html

Кроме того, реализация пользовательской кнопки «назад» нарушает основные правила качества приложений -N1: http://developer.android.com/distribute/googleplay/quality/core.html

10

При нажатии вашей кнопки вы можете иметь его по телефону:

super.onBackPressed(); 
48

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

Если вы хотите возвратить результаты деятельности одного, то при запуске активности два вам необходимо:

startActivityForResults(myIntent, MY_REQUEST_CODE); 

Внутри вашей называемой деятельности, то вы можете получить Intent от OnCreate() параметра или использовать

getIntent(); 

Для установки возвращает результат деятельности одного, то в деятельности два сделать

setResult(Activity.RESULT_OK, MyIntentToReturn); 

Если у вас нет намерения вернуть то просто сказать

setResult(Activity.RESULT_OK); 

Если деятельность имеет плохие результаты, которые вы можете использовать Activity.RESULT_CANCELED (используется по умолчанию). Затем в деятельности одного вы

onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Handle the logic for the requestCode, resultCode and data returned... 
} 

Чтобы закончить деятельность два используют те же методы, с отделкой(), как описано выше, с результатами уже установлены.

+1

«Обратите внимание, что любой код после вызова finish() будет запущен - вы можете просто сделать возврат после вызова finish(), чтобы исправить это» Я думаю, что «исправить» - это плохой выбор слов здесь. Это больше похоже на то, что вы избегаете выполнения следующих строк (не исправление). –

1

Я не знаю, было ли это даже полезно или нет, но я боролся с одной и той же проблемой, и я нашел довольно простой способ, используя только глобальную логическую переменную и действие onResume(). В моем случае моя активность C, если щелкнуть по определенной кнопке, должна вызвать финиш() Activity B!

Activity_A -> Activity_B -> Activity_C

Activity_A (открывается нормально Activity_B)

Activity_B (на некоторых нажатие кнопки открывает Activity_C):

// Global: 
boolean its_detail = false; 
// ------- 
SharedPreferences prefs = getApplicationContext().getSharedPreferences("sharedpreferences", 0); 
boolean v = prefs.getBoolean("select_client", false); 

its_detail = v; 

startActivity(C); 

@Override 
public void onResume(){ 
    super.onResume(); 
    if(its_detail == true){ 
     finish(); 
    } 
} 

Таким образом, всякий раз, когда я нажимаю на кнопку Активность C будет выполнять функцию onResume() «Activity B» и вернуться к Activity A.

4

попробовать этот код вместо finish:

onBackPressed();

+0

Прекрасно подходит для перехода от ActivityB к ActivityA. Для фрагментов и отдельных действий можно использовать ответ @Osama Ibrahim. – Eftekhari

6

если вы используете фрагмент и должны использовать

getActivity().onBackPressed(); 

при использовании одного вида деятельности, и можно использовать

finish(); 
0
{ getApplicationContext.finish(); } 

Попробуйте этот метод.

+0

Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли дать небольшое объяснение, почему оно это делает. – David

0

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

2

Я считаю, что ваше второе действие, вероятно, не связано с вашим основным видом деятельности в качестве активности ребенка. Проверьте файл AndroidManifest.xml и посмотрите, содержит ли запись <activity> для вашей дочерней активности атрибут android:parentActivityName. Это должно выглядеть примерно так:

<?xml ...?> 
... 
<activity 
    android:name=".MainActivity" 
    ...> 
</activity> 
<activity 
    android:name=".ChildActivity" 
    android:parentActivityName=".MainActivity" 
    ...> 
</activity> 
... 
1
@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == android.R.id.home) { 
      finish(); 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

Попробуйте это работает как на панели задней кнопки в аппаратной кнопки обратно.

+0

Этот работал для меня. У меня также были ** MainActivity ** и ** SettingsActivity ** с 'android: parentActivityName =.. MainActivity" для второго. Этот код обрабатывает кнопку ** Home/Back ** в панели инструментов и просто завершает текущую активность, возвращаясь к предыдущей в стеке. Благодарю. – mortalis

0

Finish закрывает все приложения, это что-то я ненавижу в разработке Android не договорил, что это хорошо, но что они не поспевают остроумие ОК синтаксис они

startActivity(intent) 

Почему не

closeActivity (намерение) ?

+1

Отвечает ли это на вопрос? Или это только предложение попробовать? В обоих случаях напыщенность не нужна и, вероятно, не приветствуется на SO –