Вопрос по android – Завершить действие из другого действия
Я хочу завершить одно действие из другого, например:
В действии [A], по нажатию кнопки, я вызываю действие [B] без завершения действия [A].
Теперь в Activity [B] есть две кнопки,New а такжеModify, Когда пользователь нажимает кнопку «Изменить», извлекает операцию [A] из стека со всеми отмеченными параметрами.
Но когда пользователь нажимает наNew Кнопка из Activity [B], тогда мне придется закончить Activity [A] из стека и снова загрузить эту Activity [A] в стек.
Я пытаюсь это сделать, но не могу завершить действие [A] из стека ... Как я могу это сделать?
Я использую код как:
Из Деятельности [A]:
<code>Intent GotoB = new Intent(A.this,B.class); startActivityForResult(GotoB,1); </code>
Другой метод в той же деятельности
<code>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); } } } </code>
А в Activity [B], по нажатию кнопки:
<code>setResult(1); finish(); </code>
Я думаю, что у меня есть самый простой подход ... на нажатие нового в 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);
}
Я только что применил решение 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);
}
Это вы можете сделать, но я думаю, что вы не должны нарушать нормальный поток активности. Если вы хотите завершить упражнение, вы можете просто отправить трансляцию из занятия 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);
Я надеюсь, что это будет работать для вас ...
Make your activity A in manifest file:
launchMode = "singleInstance"
When the user clicks new, do
FirstActivity.fa.finish();
and call the new Intent.When the user clicks modify, call the new Intent or simply finish activity B.
FIRST WAY
В первом упражнении объявитеActivity object
как это,
public static Activity fa;
onCreate()
{
fa = this;
}
Теперь используйте этот объект в другомActivity
чтобы закончить первое действие, как это,
onCreate()
{
FirstActivity.fa.finish();
}
SECOND WAY
Во время вызова вашей деятельностиFirstActivity
который вы хотите закончить, как только вы идете дальше,
Вы можете добавить флаг во время разговораFirstActivity
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
Но с использованием этого флага действие будет завершено, даже если вы этого не хотите. и когда-нибудьonBack
если вы хотите показатьFirstActivity
Вы должны будете назвать это, используя намерение.
Есть один подход, который вы можете использовать в вашем случае.
Шаг 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();
Step4: сейчасonCreate()
Метод действия A, необходимо получить этот флаг.
String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
//Write a code for add
}else {
//Write a code for modifying
}
Увидетьмой ответ на вопрос переполнения стекаFinish All previous activities.
Что вам нужно, это добавитьIntent.FLAG_CLEAR_TOP
, Этот флаг гарантирует, что все действия над целевым действием в стеке завершены и что оно отображается.
Еще одна вещь, которая вам нужна, этоSINGLE_TOP
флаг. С помощью этой функции вы не позволяете Android создавать новые действия, если они уже созданы в стеке.
Просто будьте осторожны, что если действие уже было создано, намерение с этими флагами будет доставлено в методе, называемомonNewIntent(intent)
(вам нужно перегрузить его, чтобы справиться с этим) в целевой деятельности.
Затем вonNewIntent
у вас есть метод, называемый рестарт или что-то, что будет вызыватьfinish()
и начать новое намерение к себе, или иметьrepopulate()
метод, который установит новые данные. Я предпочитаю второй подход, он дешевле и вы всегда можете извлечь
onCreate
логика в отдельный метод, который вы можете вызвать для заполнения.
Это довольно стандартный вопрос общения. Один из подходов заключается в использовании 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());
Попробуйте что-нибудь в этом роде.