簡體   English   中英

使用Intent時如何銷毀和創建新的活動實例

[英]How to destroy and create new instance of activity when using Intent

我有活動流程A-> B-> C. 現在,當我點擊活動CI中的按鈕時,想要通過銷毀活動B的現有實例並創建活動B的新實例來打開活動B.再次,如果我從活動C按下后退按鈕,那么它應該打開活動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. 但這不會創建活動B的新實例。

你能做的是

  1. 來自B活動的startActivityForResult()
  2. 然后在Acitivity c setResult() OK按鈕上單擊完成活動並在onBackpressed() setResult()失敗
  3. 如果你得到結果OK然后在B中的onActivityResult()中完成活動,如果你發送結果失敗,那么在onActivityResult()什么也不做
  4. 如果設置結果OK,則從活動C開始使用新的instnace活動b

開始活動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 && 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);
}
}

啟動Activity C,它會將結果返回給Activity B,它需要重新創建或不重新創建。

當按下后退按鈕時,將恢復ActivityB,當您單擊按鈕時,將重新創建新實例活動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;
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM