Я хочу закончить одно действие из другого действия, например:
В действии [A], при нажатии кнопки я вызываю Activity [B], не заканчивая Activity [A].
Теперь в действии [B] есть две кнопки: Новая и Изменить. Когда пользователь нажимает на модификацию, затем выдает активность [A] из стека со всеми параметрами, отмеченными галочкой.
Но когда пользователь нажимает кнопку Новая из Activity [B], мне придется завершить Activity [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();
Ответ 1
-
Сделайте свою активность A в файле манифеста: launchMode = "singleInstance"
-
Когда пользователь нажимает на новый, сделайте FirstActivity.fa.finish();
и вызовите новый Intent.
-
Когда пользователь нажимает на изменение, вызывает новый Intent или просто завершает действие 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
, вам придется называть его с помощью намерения.
Ответ 2
Это вы можете сделать, но я думаю, что вы не должны нарушать нормальный поток активности. Если вы хотите завершить упражнение, вы можете просто отправить трансляцию из занятия B в упражнение A.
Создайте приемник вещания, прежде чем начинать свою деятельность.
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);
Я надеюсь, что это будет работать для вас...
Ответ 3
Это довольно стандартный коммуникационный вопрос. Один из подходов заключался бы в использовании 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);
а затем в Activity B вы можете просто закончить его по требованию следующим образом:
((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());
Попробуйте что-нибудь подобное.
Ответ 4
Есть один подход, который вы можете использовать в вашем случае.
Шаг 1: Запустите упражнение B из занятия A
startActivity(new Intent(A.this, B.class));
Шаг 2: Если пользователь нажимает кнопку "Изменить", запускайте FLAG_ACTIVITY_CLEAR_TOP
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: Если пользователь нажимает кнопку "Добавить", запускайте FLAG_ACTIVITY_CLEAR_TOP
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()
в Activity A должен получить этот флаг.
String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
//Write a code for add
}else {
//Write a code for modifying
}
Ответ 5
См. мой ответ на вопрос о переполнении стека. Завершить все предыдущие действия.
Вам нужно добавить Intent.FLAG_CLEAR_TOP
. Этот флаг гарантирует, что все действия над целевой деятельностью в стеке будут завершены и отобразятся.
Еще одна вещь, которая вам нужна - это флаг SINGLE_TOP
. С помощью этого вы запретите Android создавать новое действие, если в стеке уже есть один.
Просто опасайтесь, что если действие уже было создано, намерение с этими флагами будет доставлено в методе onNewIntent(intent)
(вам нужно перегрузить его для его обработки) в целевой активности.
Затем в onNewIntent
у вас есть метод под названием restart или что-то, что вызовет finish()
и запустит новое намерение по отношению к самому себе или будет иметь метод repopulate()
, который будет устанавливать новые данные. Я предпочитаю второй подход, он дешевле, и вы всегда можете извлечь
onCreate
в отдельный метод, который вы можете вызвать для заполнения.
Ответ 6
Я только что применил решение 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);
}
Ответ 7
Начните свою деятельность с кода запроса:
StartActivityForResult(intent,1003);
И вы можете закрыть его от любого другого действия, как это:
FinishActivity(1003);
Ответ 8
Я думаю, что у меня самый простой подход... при нажатии нового в 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);
}
Ответ 9
Я знаю, что это старый вопрос, некоторые из этих методов не работают для меня, поэтому для тех, кто смотрит в будущее, или с моими проблемами это сработало для меня.
Я перепробовал onPause
и называл finish()
внутри этого метода.
Ответ 10
Я хочу, чтобы вы посмотрели раздел здесь.
Он работает полностью и без проблем.
Активность a
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) {}
}
}
Ответ 11
Сначала вызовите startactivity()
затем используйте finish()