从Android应用程序堆栈手动删除活动

5

我一直在开发Android原生应用,我的目标是:

Activities - A -> B -> C  Then  A-> B -> C -> C  . 

如果在C活动中再次指向C,我希望手动从堆栈中删除C、B。在我的背后,它只能移动到A。

我尝试使用finish()解决问题,但问题是:

Activities - A -> B ->  C  Then  A-> B -> C -> C  on finish A -> B -> C  required state A-> C .

有人知道如何捕获堆栈中的所有活动并从堆栈中删除特定的活动吗?

正确的做法是使用Intent.FLAG_ACTIVITY_CLEAR_TOP标志并启动活动A。请查看blahdiblah的答案。 - M-Wajeeh
6个回答

6
在C活动中,重写onBackPressed方法,并添加类似以下内容的代码:
@Override
public void onBackPressed() {
    if (shouldGoBackToA) {  // There are various ways this could be set
        Intent intent = new Intent(this, AActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
    } else {
        finish();
    }
}
FLAG_ACTIVITY_CLEAR_TOP会导致应用程序返回到栈中现有的A Activity而不是启动一个新的Activity。来自文档

public static final int FLAG_ACTIVITY_CLEAR_TOP
如果设置了此标志,并且要启动的Activity已经在当前任务中运行,则关闭其上方的所有其他Activity,将此Intent交付给(现在位于顶部的)旧Activity作为新Intent。


这是正确的做法。所有其他答案都是做此事的糟糕方式。应该标记为答案。 - M-Wajeeh

0
在活动C中,当返回按钮被按下时,像这样启动活动A:
@Override
public void onBackPressed() {
  Intent intent = new Intent(getApplicationContext(), A.class);
  intent.putExtra("EXIT", true);
  startActivity(intent);
}

然后在Activity A的onCreate()方法中这样做

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();  
}

0
在调用意图时传递一个名为“activity clear top”的标志,就像这样:
Intent newIntent=new Intent(this,MainActivity.class);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(newIntent);

在调用B活动时不要设置此标志,从B到C时请设置此标志。 - VINIL SATRASALA
如果我添加这个,你认为我会得到A活动吗? - Rizvan
你能否更准确地提出你的问题? - VINIL SATRASALA
3
如果我添加了“clear top”,那么从C活动就无法获取A活动。 - Rizvan

0

步骤1:启动活动以获取结果 A -> B -> C1 -> C2.. 使用 startActivityForResult 调用您的活动

Intent intent = new Intent(yourActivity.this, nextActivity.class);
startActivityForResult(intent, 1);

步骤2:在C2中指定您要返回到A。 无论何时完成活动,请编写以下代码

Intent i = getIntent();
i.putString("Result","GottoA");
setResult(Activity.RESULT_OK, i);
finish();

步骤3:每当C2完成时,先前的堆栈活动onActivityResult会被调用。因此,您可以在C1和B的onActivityResult中检查是否已设置任何结果,并相应地完成并实现以下代码在Activity B和C中。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     Intent i = getIntent();    
     if (resultCode == RESULT_OK && i.getString("Result","null").equals"GottoA") { 
        i.putString("Result","GottoA");
        setResult(RESULT_OK, i);
        finish();
       }
    }

0
你可以这样使用: 在 A Activity 中传递到 B Activity 时,Intent 应该添加一个 FLAG_ACTIVITY_NO_HISTORY 标志,像这样,
Button b=(Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent newIntent=new Intent(AActivity.this,Bactivty.class);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                startActivity(newIntent);
            }
        });

在转移到CActivity时:

Button b = (Button) findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent newIntent = new Intent(Bactivty.this, CActivity.class);
                startActivity(newIntent);
            }
        });

现在按下返回键将会带您回到AActivity。


-1

这个完整的例子可能会对你有所帮助...

public class ActivityA extends Activity {

    public static final int ID_TEXTVIEW = 0xDEAF1;
    public static final int ID_BUTTON = 0xDEAF2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View contentView = getContentView(this);
        TextView textView = (TextView) contentView.findViewById(ID_TEXTVIEW);
        textView.setText("ActivityA");
        setContentView(contentView);

        final Button button = (Button) contentView.findViewById(ID_BUTTON);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivity(intent);
            }
        });
    }

    public static View getContentView(Context context) {
        LinearLayout layout = new LinearLayout(context);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.setGravity(Gravity.CENTER);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.gravity = Gravity.CENTER_HORIZONTAL;

        TextView textView = new TextView(context);
        textView.setLayoutParams(layoutParams);
        textView.setId(ID_TEXTVIEW);
        layout.addView(textView);

        Button button = new Button(context);
        button.setText("Next");
        button.setLayoutParams(layoutParams);
        button.setId(ID_BUTTON);
        layout.addView(button);
        return layout;
    }
}



public class ActivityB extends Activity {

    public static final String ACTION_FINISH = "com.myapp.test2.ACTION_FINISH";

    public ActivityB() {
    }

    private FinishReceiver finishReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View contentView = ActivityA.getContentView(this);
        final TextView textView = (TextView) contentView
                .findViewById(ActivityA.ID_TEXTVIEW);
        textView.setText("ActivityB");
        setContentView(contentView);

        final Button button = (Button) contentView
                .findViewById(ActivityA.ID_BUTTON);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityB.this, ActivityC.class);
                startActivity(intent);
            }
        });

        finishReceiver = new FinishReceiver();
        IntentFilter filter = new IntentFilter(ACTION_FINISH);
        registerReceiver(finishReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(finishReceiver);
    }

    private class FinishReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(ACTION_FINISH)) {
                finish();
            }
        }
    }
}


public class ActivityC extends Activity {

    public ActivityC() {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        View contentView = ActivityA.getContentView(this);
        final TextView textView = (TextView) contentView
                .findViewById(ActivityA.ID_TEXTVIEW);
        textView.setText("ActivityC");
        setContentView(contentView);

        final Button button = (Button) contentView.findViewById(ActivityA.ID_BUTTON);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityB.ACTION_FINISH);
                sendBroadcast(intent);
                intent = new Intent(ActivityC.this, ActivityC.class);
                startActivity(intent);
                finish();
            }
        });
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接