2012-04-30 4 views
68

Я хочу закончить одну деятельность от другой деятельности, как:Закончите деятельность от другой деятельности

В деятельности [A], на кнопку мыши, я звоню активность [B] без отделки активность [A].

В настоящее время в деятельности [B], есть две кнопки, Новый и Изменить. Когда пользователь нажимает на модификацию, вы можете активировать активность [A] из стека со всеми параметрами, отмеченными галочкой.

Но когда пользователь нажимает на кнопку New из Activity [B], тогда мне нужно будет завершить операцию [A] из стека и снова загрузите эту операцию [A] в стек.

Я пытаюсь, но я не могу завершить Activity [A] из стека ... Как я могу это сделать?

Я использую код, как:

от деятельности [A]:

Intent GotoB = new Intent(A.this,B.class); 
startActivityForResult(GotoB,1); 

Другой способ в той же деятельности

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

    if (requestCode == 1) 
    { 
     if (resultCode == 1) { 
      Intent i = getIntent(); 
      overridePendingTransition(0, 0); 
      i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
      finish(); 

      overridePendingTransition(0, 0); 
      startActivity(i); 
     } 
    } 
} 

И в деятельности [B] на кнопку мыши :

setResult(1); 
finish(); 
+0

эй, вы хотите, чтобы закончить одну деятельность от другого права ... затем я опубликовал ответ, который является правильным. Но почему вы проголосовали за это? – Manjunath

+0

Существует нить с несколькими хорошими ответами здесь: http://stackoverflow.com/questions/14355731/killing-one-activity-from-another/16438596#16438596 –

ответ

155
  1. сделать вашу активность А в файле манифеста: launchMode = "singleInstance"

  2. Когда пользователь нажимает новые, сделать FirstActivity.fa.finish(); и вызвать новый Intent.

  3. Когда пользователь щелкает изменения, вызовите новый Intent или просто закончить деятельность Б.

ПЕРВЫЙ ПУТЬ

В вашей первой деятельности, объявить один Activity object как это,

public static Activity fa; 
onCreate() 
{ 
    fa = this; 
} 

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

onCreate() 
{ 
    FirstActivity.fa.finish(); 
} 

ВТОРОЙ ПУТЬ

Призывая вашу деятельность FirstActivity который вы хотите закончить, как только вы двигаться дальше, Вы можете добавить флаг при вызове FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

Но используя этот флаг, активность будет завершена, даже если вы этого не хотите. и когда-нибудь onBack, если вы хотите показать FirstActivity, вам нужно будет позвонить ему, используя намерения.

+5

Отличный ответ .. !! –

+55

У вас есть статическая ссылка на активность. Это никогда не исчезнет, ​​если вы не очистите его вручную -> вы создаете утечку памяти! – DArkO

+0

Плюс для объявления активности singleInstance также не является хорошей практикой. Это рекомендуется только для приложений типа Launcher. Вместо этого следует использовать «singleTop». – DArkO

4

См. my answer to Stack Overflow question Finish All previous activities.

Что вам нужно, это добавить Intent.FLAG_CLEAR_TOP. Этот флаг гарантирует, что все действия над целевой деятельностью в стеке будут завершены, и это будет показано.

Еще одна вещь, которая вам нужна - это флаг SINGLE_TOP. С помощью этого вы запретите Android создавать новое действие, если в стеке уже есть один.

Просто будьте осторожны: если действие уже было создано, намерение с этими флагами будет доставлено в методе onNewIntent(intent) (вам нужно перегрузить его для его обработки) в целевом действии.

Затем в onNewIntent у вас есть метод, называемый перезапуском, или что-то, что вызовет finish() и запустит новое намерение по отношению к самому себе или будет иметь метод repopulate(), который установит новые данные. Я предпочитаю второй подход, он дешевле, и вы всегда можете извлечь логику 4444 в отдельный метод, который вы можете вызвать для заполнения.

+0

Отличный ответ DArko ... действительно приятное решение. ... :) –

57

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

Создать широковещательный приемник перед началом деятельности B:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     String action = intent.getAction(); 
     if (action.equals("finish_activity")) { 
      finish(); 
      // DO WHATEVER YOU WANT. 
     } 
    } 
}; 
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity")); 

Отправить радиопередачу от активности В к деятельности A, когда вы хотите завершить деятельность A от B

Intent intent = new Intent("finish_activity"); 
sendBroadcast(intent); 

Надеюсь, что это сработает для вас ...

+0

Он показывает эту ошибку: «Ошибка синтаксиса на токенах, AnnotationName ожидается вместо« on »registerReceiver (broadcast_reciever, новый IntentFilter (« finish_activity »));». Что случилось? – Behzad

+0

«Вы не должны нарушать нормальный поток активности» +1 для этого –

+0

Отлично работает, спасибо! – Nick

15

Это довольно стандартный вопрос связи. Один из подходов будет использовать ResultReceiver в деятельности A:

Intent GotoB=new Intent(A.this,B.class); 
GotoB.putExtra("finisher", new ResultReceiver(null) { 
    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     A.this.finish(); 
    } 
}); 
startActivityForResult(GotoB,1); 

, а затем в активность B вы можете просто закончить его по требованию, как так:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle()); 

Попробуйте что-нибудь подобное.

+0

Нет Это не работает – Kanika

+3

+1 Отлично. Это что-то новое для меня. – Dharmendra

+3

+1 just, ((ResultReceiver) getIntent(). GetParcelableExtra («финишер»)). Send (1, новый Bundle()); – Hamidreza

9

Существует один подход, который вы можете использовать в своем случае.

Шаг1: Начало активности B от Activity A

startActivity(new Intent(A.this, B.class)); 

Шаг2: Если пользователь нажимает на кнопку MODIFY начать активность A с помощью FLAG_ACTIVITY_CLEAR_TOP .Также передать флаг в дополнительный.

Intent i = new Intent(B.this, A.class); 
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
i.putExtra("flag", "modify"); 
startActivity(i); 
finish(); 

Шаг 3: Если пользователь нажимает на кнопку MODIFY начать активность A с помощью FLAG_ACTIVITY_CLEAR_TOP .Также передать флаг в дополнительный.

Intent i = new Intent(B.this, A.class); 
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
i.putExtra("flag", "add"); 
startActivity(i); 
finish(); 

Шаг 4: Теперь onCreate() метод активность А, напишите ниже код.

String flag = getIntent().getStringExtra("flag"); 
if(flag.equals("add")) { 
    //Write a code for add 
}else { 
    //Write a code for modify 
} 
+0

хороший ответ .... – MKJParekh

+0

Спасибо @Frankenstein – Dharmendra

1

Я думаю, что у меня самый простой подход ... при нажатии нового в B ..

Intent intent = new Intent(B.this, A.class); 
intent.putExtra("NewClicked", true); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

и в А получить его

if (getIntent().getBooleanExtra("NewClicked", false)) { 
     finish();// finish yourself and make a create a new Instance of yours. 
     Intent intent = new Intent(A.this,A.class); 
     startActivity(intent); 
    } 
1

Я только что применяется решение Nepster и работает как шарм. Существует незначительная модификация, чтобы запустить его из фрагмента.

К вашему Фрагмент

// sending intent to onNewIntent() of MainActivity 
Intent intent = new Intent(getActivity(), MainActivity.class); 
intent.putExtra("transparent_nav_changed", true); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

И к вашему OnNewIntent() от деятельности вы хотели бы, чтобы перезагрузить.

// recreate activity when transparent_nav was just changed 
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) { 
    finish(); // finish and create a new Instance 
    Intent restarter = new Intent(MainActivity.this, MainActivity.class); 
    startActivity(restarter); 
} 
0

Я знаю, что это старый вопрос, некоторые из этих методов не работают для меня так и для тех, кто ищет в будущем или иметь мои проблемы это работало для меня

Я отменяю onPause и называюсь finish() внутри это способ.

0

Я хочу, чтобы вы посмотрели обмен here. Работает полностью и без проблем.

активность

public static ActivityA instance = null; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instance = this; 
} 

@Override 
public void finish() { 
    super.finish(); 
    instance = null; 
} 

активность б

public void onCreate(Bundle savedInstanceState) { 
    if(ActivityA.instance != null) { 
     try { 
      ActivityA.instance.finish(); 
     } catch (Exception e) {} 
    } 
} 
0

Первый вызов startactivity(), чем использование отделки()

Смежные вопросы