如何动态返回完成的活动?

时间:2019-05-31 10:14:16

标签: android

例如,用户在活动A到B之间进行了传递。现在完成A并将B传递给C,然后完成B。然后单击返回按钮并再次进入B。因为B是用户来自当前活动(ActivityC)的活动。如果用户直接从A转到C,则完成A。如果按返回按钮,则再次转到A。因为A是用户来自于当前(ActivityC)活动的活动。    我想设置onBackPress按钮以启动有序启动的活动。如果我没有完成在开始另一个活动之前开始的活动,则可以使用finish()当前活动显示之前开始的活动。这个有可能。因为我没有完成任何活动。因此,finish()当前活动将导致之前开始的show活动。但是,RAM可能会在我打开50个活动时过载。因此由于这个问题,我需要完成之前开始的finish()活动。另一方面,单击后退按钮时,我想启动有序启动的活动。例如

  ActivityA --> ActivityB --> ActivityC --> ActivityD

在这种情况下,我按顺序完成ActivityA,ActivityB和ActivityC。但是我想在按下ActivityD时启动ActivityC,而我想在按下ActivityC时启动ActivityB。

最后,我在应用程序中有一条复杂的路径。而且,我导航到ActivityD并在当前活动为ActivityF时完成了ActivityF

ActivityF --> ActivityD
ActivityF finished

当前活动:

ActivityD

在这种情况下,我想启动ActivityF而不是ActivityD的后退按钮上的ActivityC。

通常:

ActivityA --> ActivityB --> ActivityC --> ActivityD /// click back button
ActivityA --> ActivityB --> ActivityC /// click back button
ActivityA --> ActivityB /// click back button
ActivityA

ActivityA --> ActivityF --> ActivityD /// click back button
ActivityA --> ActivityF /// click back button
ActivityA

但是我想生成这种情况:

ActivityA
--> ActivityB
--> ActivityC
--> ActivityD /// click back button
ActivityC <-- /// click back button
ActivityB <-- /// click back button
ActivityA 

ActivityA
--> ActivityF
--> ActivityD /// click back button
ActivityF <-- /// click back button
ActivityA <--

3 个答案:

答案 0 :(得分:1)

您应该使用Stack来跟踪您的活动。 Stack in Android

只需将当前“活动”之前的“意图”推入下一个活动,然后以onBackPressed()方法弹出当前活动。

您可以将Stack保存在SharedPreference上。

编辑:

这是代码。我使用了DataHandler类来保存Stack

DataHandler.java

public class DataHandler {
private static DataHandler mDataHandler;
private Deque<Intent> stack = new ArrayDeque<>();

private DataHandler() {
}

public static DataHandler getInstance(){
    if(mDataHandler == null){
        mDataHandler = new DataHandler();
    }
    return mDataHandler;
}

public Deque<Intent> getStack() {
    return stack;
}

public void setStack(Deque<Intent> stack) {
    this.stack = stack;
}
}

M1Activity.java

public class M1Activity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_m1);
    Button btn = findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(M1Activity.this,M2Activity.class);
            startActivity(intent);
            DataHandler.getInstance().getStack().push(intent);
            finish();
        }
    });
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    if (DataHandler.getInstance().getStack().size() > 0){
        Intent intent = DataHandler.getInstance().getStack().pop();
        startActivity(intent);
    }
}
}

就像M1Activity一样,您必须在每个Stack中从Activity推送和弹出意图。

答案 1 :(得分:0)

您可以使用

 if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {           
   finish();
 } else {
   ActivityCompat.finishAffinity(RatingReviewActivity.this);
 }

答案 2 :(得分:0)

您需要将ActivityA(父活动)名称传递给ActivityB(子活动),以保留对父活动的引用,并在开始父活动所需的0-9方法中使用它。

开始活动时:

onBackPressed

在儿童活动中:

private void startActivity(){
    Intent intent =new Intent(this, ActivityB.class);
    intent.putExtra("parentClassName",this.getClass().getName());
    startActivity(intent);
    finish();
}