Как уничтожить и создать новый экземпляр activity при использовании Intent

#android #android-intent #android-activity

#Android #android-намерение #android-activity

Вопрос:

У меня есть поток действий A-> B-> C. Теперь, когда я нажимаю на кнопку в Activity C, я хочу открыть activity B, уничтожив существующий экземпляр Activity B и создав новый экземпляр Activity B. Опять же, если из Activity C, если я нажму кнопку «Назад», он должен открыть существующий экземпляр Activity B.

Код, который я пробовал, это :

     Intent i=new Intent(C.this,B.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
  

Итак, после выполнения этого стека намерений должно быть A-> B.
Но это не создает новый экземпляр Activity B.

Комментарии:

1. вызовите метод finish() для уничтожения activity

2. Если я вызову finish() при открытии Activity C из Activity B и если я нажму назад в Activity C, тогда он будет напрямую переходить к Activity A, поскольку он завершил Activity B.

3. когда вы нажимаете на кнопку, то в это время вызываете finish ()

4. Намерение i=новое намерение (C.это,B.class ); startActivity(i); он создаст новый экземпляр

5. Это не создает новый экземпляр, но открытие существующего экземпляра может быть связано с тем, что я взял onNewIntent(намерение i) в Activity B.

Ответ №1:

Что вы можете сделать, это

  1. startActivityForResult() из B activity
  2. Затем в Activity c нажмите кнопку setResult() OK, чтобы завершить действие, и в onBackpressed() SetResult() произойдет сбой
  3. Если вы получите результат OK, завершите действие в onActivityResult() in B, если вы отправили результат с ошибкой, тогда ничего не делайте в onActivityResult()
  4. Если вы установили result OK, запустите activity b из activity C со свежим instnace

Комментарии:

1. Это завершит действие B, но тогда как создать новый экземпляр Activity B с набором данных из Activity C?

2. Начните новую активность с намерением

Ответ №2:

Запустить Activity C

ActivityB

 public class ActivityB extends AppCompatActivity implements View.OnClickListener {

private TextView activity;
private Button start_next_activity;
private final int req_code_reset_activity = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();

    activity.setText("ActivityB");
    start_next_activity.setText("Start Activity C");


    Bundle res = getIntent().getExtras();
    if (res != null) {
        String my_data = res.getString("my_data");
        if (my_data != null)
            activity.setText(activity.getText()   " data rcvd = "   my_data);
    }

}


private void initView() {
    activity = (TextView) findViewById(R.id.activity);
    start_next_activity = (Button) findViewById(R.id.start_next_activity);

    start_next_activity.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.start_next_activity:
            startActivityForResult(new Intent(this, ActivityC.class), req_code_reset_activity);
            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);


    if (requestCode == req_code_reset_activity amp;amp; resultCode == RESULT_OK) {

        if (null != data) {
            Bundle res = data.getExtras();
            String result = res.getString("my_data");
            Log.d("my_data", "my_data:"   result);
            restartActivity(data);

        }
    }


}

public void restartActivity(Intent intent) {
    Intent mIntent = getIntent();
    mIntent.putExtras(intent.getExtras());
    finish();
    startActivity(mIntent);
}
}
  

Запустите действие C, оно вернет результат для действия B, если его нужно воссоздать или нет.

при нажатии кнопки «Назад» ActivityB будет восстановлен, а при нажатии на кнопку будет воссоздан новый экземпляр Activity B.

ActivityC

 public class ActivityC extends AppCompatActivity implements View.OnClickListener {
private TextView activity;
private Button start_next_activity;
private final int req_code_reset_activity = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();

    activity.setText("ActivityC");
    start_next_activity.setText("New instance Activity B");

}


private void initView() {
    activity = (TextView) findViewById(R.id.activity);
    start_next_activity = (Button) findViewById(R.id.start_next_activity);
    start_next_activity.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.start_next_activity:
            Bundle conData = new Bundle();
            conData.putString("my_data", "This is sample data");
            Intent intent = new Intent();
            intent.putExtras(conData);
            setResult(RESULT_OK, intent);
            finish();
            break;
    }
}
}
  

Комментарии:

1. это завершит и воссоздаст действие B, но как насчет данных, которые я установил в intent в Activity C. Я не могу получить эти данные.

2. @Kesha проверьте обновленный ответ таким образом, вы можете получить данные

3. не кормите людей ложкой, StackOverflow не создан для этого. Старайтесь направлять, а не публиковать фактический код для людей.