Intereting Posts
Получение ошибки «Метод Gradle DSL не найден:« compile () », когда Syncing Build.Gradle Ошибка декомпрессии буфера Android для устройства snapdragon Преобразование битовой карты Java в байтовый массив Изменение позиции просмотра после окончания анимации SHA256 с RSA-сигнатурой возвращает разные выходы на различные устройства Android Скрытие изображений, которые не загружались Изменение цвета фона в календаре в день Когда я меняю ориентацию с портрета на пейзаж, мой расчетный результат исчезает. Как его решить? Аспектно-ориентированное программирование в android Изменение цвета светодиода для уведомлений Дешевый / быстрый способ хеш-битмапов? Извлечение большого количества данных, каков наилучший способ? Отображать всю музыку на SD-карте Соединение Bluetooth RFCOMM не может быть установлено последовательно на Android 4.2 AutoCompleteTextView не отображает результат даже при обновлении ArrayAdapter

Завершить работу из другой деятельности

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

В Activity [A], при нажатии кнопки, я вызываю Activity [B], не заканчивая Activity [A].

Теперь в Activity [B] есть две кнопки: New и Modify . Когда пользователь нажимает на модификацию, вызывается активность [A] из стека со всеми параметрами, отмеченными галочкой.

Но когда пользователь нажимает кнопку « Новый» из «Активность» [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(); 

Solutions Collecting From Web of "Завершить работу из другой деятельности"

  1. Сделайте свою активность A в файле манифеста: launchMode = "singleInstance"

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

  3. Когда пользователь нажимает кнопку «Изменить», вызовите новый 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 вам придется называть его с помощью намерения.

Это вы можете сделать, но я думаю, что вы не должны нарушать нормальный поток активности. Если вы хотите закончить свою деятельность, вы можете просто отправить трансляцию из своей активности B в действие A.

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

 BroadcastReceiver broadcast_reciever = 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(broadcast_reciever, 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); 

А затем в Activity B вы можете просто закончить его по запросу так:

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

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

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

Шаг 1: Запустите операцию B из Activity A

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

Шаг 2. Если пользователь 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", "modify"); startActivity(i); finish(); 

Шаг 3: Если пользователь 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 modify } 

См. Мой ответ на вопрос «Переполнение стека». Завершить все предыдущие действия .

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

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

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

Затем в onNewIntent вас есть метод с именем restart или что-то, что вызовет 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); 

И в A получить его

  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); }