Завершить действие из другого действия
Я хочу завершить одно действие из другого, например:
В действии [A], при нажатии кнопки, я вызываю действие [B] без завершения действия [A].
Теперь в Activity [B] есть две кнопки, New и Modify. Когда пользователь нажимает кнопку "Изменить", извлекает действие [A] из стека со всеми отмеченными параметрами.
Но когда пользователь нажмет на кнопку "Создать" в Activity [B], мне придется закончить Activity [A] из стека и снова загрузить эту Activity [A] в стек.
Я пытаюсь это сделать, но я не могу завершить действие [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
}
Начните свою деятельность с кода запроса:
StartActivityForResult(intent,1003);
И вы можете закрыть его от любого другого действия, как это:
FinishActivity(1003);
Я только что применил решение Непстера и работает как шарм. Есть небольшая модификация, чтобы запустить его из фрагмента.
К вашему фрагменту
// 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.FLAG_CLEAR_TOP
, Этот флаг гарантирует, что все действия над целевым действием в стеке завершены и что оно отображается.
Еще одна вещь, которая вам нужна, это SINGLE_TOP
флаг. С помощью этой функции вы запрещаете Android создавать новое действие, если оно уже создано в стеке.
Просто будьте осторожны, что если действие уже было создано, намерение с этими флагами будет доставлено в методе, называемом onNewIntent(intent)
(вам нужно перегрузить его, чтобы справиться с этим) в целевой деятельности.
Затем в onNewIntent
у вас есть метод, называемый рестарт или что-то, что будет вызывать finish()
и начать новое намерение к себе, или иметь repopulate()
метод, который установит новые данные. Я предпочитаю второй подход, он дешевле и вы всегда можете извлечь onCreate
логика в отдельный метод, который вы можете вызвать для заполнения.
Я думаю, что у меня есть самый простой подход... на нажатие нового в 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);
}
Я знаю, что это старый вопрос, некоторые из этих методов не сработали для меня, так что для тех, кто смотрит в будущее или у меня проблемы, это сработало для меня
Я переиграл 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;
}
Деятельность б
public void onCreate(Bundle savedInstanceState) {
if(ActivityA.instance != null) {
try {
ActivityA.instance.finish();
} catch (Exception e) {}
}
}