Как закрыть Мероприятия - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть 4 действия, и у каждого есть различные объекты, которые можно получить с сервера. Основная цель - когда я отправляю окончательные данные в упражнении 4, нужно снова вызвать упражнение 1. Я опробовал несколько методов, легко перейти от действия D к основному действию, но я хотел бы также очистить все предыдущие действия, что отличает этот вопрос.

App Activity cycle

В это время я должен закрыть действие B и C. Если я просто закончу действие D и начну задание A с новым намерением, предыдущие действия будут активны, и всякий раз, когда я захочу вернуться из приложения, я снова смогу увидеть эти действия , Как я могу закрыть несколько занятий одновременно?

Final purpose

Ответы [ 10 ]

0 голосов
/ 06 ноября 2018

Решение: Вы можете закрыть любое действие из любого другого действия, выполнив следующее: (Выполните следующие шаги)

Шаг 1: Создать статический объект каждого класса до onCreate():

public static YourActivityClass activity;

Step2: Затем в вашем onCreate() инициализируйте его:

activity = YourActivityClass.this

Шаг 3: Теперь вы можете завершить его с любого вида деятельности, который вы хотите:

YourActivityClass.activity.finish();

Точно так же вы можете сделать это для каждого действия, которое вы хотите закрыть от любого другого действия.

Альтернативный метод : Просто не передавайте историю в намерениях:

Intent intent = new Intent(ActivityD.this, ActivityA.class);  
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
finish();

Выбор использования решения остается за вами. Всего наилучшего.

0 голосов
/ 06 ноября 2018

Один из возможных способов сделать это - запустить каждое действие с помощью startActivityForResult, а затем обработать закрытие действий в обратном вызове onActivityResult.

0 голосов
/ 06 ноября 2018

Этого можно добиться разными способами.

  1. Использование флага noHistory внутри объявления активности на manifests.xml

    <activity
        android:name=".Acitivity_B"  <!-- do same with activity c and d -->
        android:noHistory="true"/> 
    
  2. Использование startActivityForResult

    startActivityForResult(intent,101);
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == 101)
            finish();
    }
    
0 голосов
/ 06 ноября 2018

Вы можете использовать EventBus для этого.

Определение класса событий FinishActivity

public class FinishActivity{

}

зарегистрировать событие в действии B, C

вы можете использовать

EventBus.getDefault().register(this)

в вашем методе onCreate для регистрации и отмены регистрации в onDestroy на EventBus.getDefault().unregister(this). Создайте один метод в вашей деятельностиB, C.

public void onMainThreadEvent(FinishActivity event) {
     finish();
}

Вы можете отправить событие FinishActivity по EventBus.getDefault().post(new FinishAxtivity()); Деятельность B, C завершит себя после отправки этого события.

0 голосов
/ 06 ноября 2018

2 строки в Деятельности D могут творить чудеса.

В вашем onBackPressed() методе Activity D.

Добавить тезисы

@Override
     public void onBackPressed() {    
            startActivity(new Intent(Activity_D.this,Activity_A.class));
            finishAffinity();
        }

FinishAffinity удалит все открытые действия. Таким образом, только активность А останется открытой

0 голосов
/ 06 ноября 2018

Используйте FLAG_ACTIVITY_CLEAR_TOP Intent Flag, чтобы снова начать действие A, используя -

Intent intent = new Intent(ActivityD.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Этот флаг очистит B и C от стека и откроет A.

0 голосов
/ 06 ноября 2018

Используйте флажки намерения, чтобы очистить стек,

 Intent intent = new Intent(D.this,A.class);  
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);

Тогда Действие A будет только в стеке

0 голосов
/ 06 ноября 2018

использовали ли вы следующий флаг

Intent.FLAG_ACTIVITY_NEW_TASK

Intent intent = new Intent(CLASS_D.this, CLASS_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
0 голосов
/ 06 ноября 2018

Запустите операцию A из операции D с флагами FLAG_ACTIVITY_CLEAR_TASK и FLAG_ACTIVITY_NEW_TASK , чтобы очистить стек при создании новой операции.

0 голосов
/ 06 ноября 2018

для возврата из действия D в действие A передать намерение в методе onBackPressed ().

@Override
     public void onBackPressed() {
            Intent in = new Intent(Activity-D.this,Activity-A.class);
            startActivity(in);
            finish();
        }
...