Завершение действия из другого действия
Я хочу закончить одно действие из другого действия, например:
в Activity [A], при нажатии кнопки, я вызываю Activity [B] без завершения Activity [A].
Теперь в Activity [B] есть две кнопки, новая и изменить. Когда пользователь нажимает на кнопку Изменить, затем всплывает действие [A] из стека со всеми отмеченными параметрами..
но когда пользователь нажимает на новая кнопка из 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);
}
}
}
и в Activity [B], на кнопку нажмите:
setResult(1);
finish();
11 ответов:
Сделайте свою активность A в файле манифеста:
launchMode = "singleInstance"
когда пользователь нажимает кнопку Новый, сделать
FirstActivity.fa.finish();
и вызовите новое намерение.когда пользователь нажимает кнопку Изменить, вызовите новое намерение или просто завершите действие B.
ПЕРВЫЙ СПОСОБ
в вашем первом действии объявите один
Activity object
как этоpublic static Activity fa; onCreate() { fa = this; }
теперь использовать этот объект в другом
Activity
чтобы закончить первый-деятельность, как это,onCreate() { FirstActivity.fa.finish(); }
ВТОРОЙ ПУТЬ
при вызове вашей активности
FirstActivity
который вы хотите закончить, как только вы двигаетесь дальше, Вы можете добавить флаг при вызовеFirstActivity
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
но с помощью этого флага деятельность будет завершена, даже если вы этого не хотите. и когда-нибудь
onBack
если вы хотите показатьFirstActivity
вы должны будете назвать его с помощью намерения.
что вы можете сделать, но я думаю, что вы не должны нарушать нормального хода деятельности. Если вы хотите закончить свою деятельность, вы можете просто отправить трансляцию из вашего действия B в действие A.
создайте широковещательный приемник перед началом вашей деятельности 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"));
отправить трансляцию из действия B в действие A, когда вы хотите закончить действие A из B
Intent intent = new Intent("finish_activity"); sendBroadcast(intent);
Я надеюсь, что это будет работать для вас...
Это довольно стандартный вопрос коммуникации. Одним из подходов было бы использовать 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());
попробуйте что-то вроде этого.
есть один подход, который можно использовать в вашем случае.
Шаг 1: Запустите действие B Из действия a
startActivity(new Intent(A.this, B.class));
Шаг 2: если пользователь нажимает на кнопку Изменить начать действие 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: если пользователь нажимает на кнопку Добавить начать действие A с помощью
FLAG_ACTIVITY_CLEAR_TOP
.Кроме того, передайте флаг в экстра.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()
метод действия A, необходимо получить этот флаг.String flag = getIntent().getStringExtra("flag"); if(flag.equals("add")) { //Write a code for add }else { //Write a code for modifying }
посмотреть мой ответ на вопрос переполнения стека завершить все предыдущие действия.
что вам нужно, это добавить
Intent.FLAG_CLEAR_TOP
. Этот флаг гарантирует, что все действия над целевым действием в стеке завершены и что один показан.еще одна вещь, которая вам нужна, это
SINGLE_TOP
флаг. С помощью этого вы не позволяете Android создавать новое действие, если оно уже создано в стеке.просто быть осторожно, что если действие уже было создано, намерение с этими флагами будет доставлено в методе под названием
onNewIntent(intent)
(нужно перегружать его, чтобы справиться с этим) в целевой деятельности.затем в
onNewIntent
у вас есть метод под названием restart или что-то, что вызоветfinish()
и запустить новое намерение к себе, или иметьrepopulate()
метод, который установит новые данные. Я предпочитаю второй подход, это дешевле, и вы всегда можете извлечьonCreate
логика в отдельный метод, который можно вызвать для заполнения.
Я только что применил решение 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); }
Я думаю, что самый простой подход... при нажатии новое в Б..
Intent intent = new Intent(B.this, A.class); intent.putExtra("NewClicked", true); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
и в A get it
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); }
Я знаю, что это старый вопрос, некоторые из этих методов не работали для меня, поэтому для тех, кто смотрит в будущее или имеет мои проблемы, это сработало для меня
Я обошел
onPause
и позвонилfinish()
внутри этого метода.
Я хочу, чтобы вы взглянули на обмен здесь. Он работает полностью и без проблем.
активность
public static ActivityA instance = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance = this; } @Override public void finish() { super.finish(); instance = null; }
активность b
public void onCreate(Bundle savedInstanceState) { if(ActivityA.instance != null) { try { ActivityA.instance.finish(); } catch (Exception e) {} } }