从Android应用堆栈中手动删除活动

时间:2013-11-06 07:16:10

标签: java android stack

我一直致力于Android Native App,我的目的是:

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

如果从C活动再次指向C,那么我想手动从堆栈中删除C,B。 在我的背上它应该只移动到A.

我尝试完成()但问题是:

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

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

6 个答案:

答案 0 :(得分: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的现有副本,而不是开始新的副本。 From the docs

  

public static final int FLAG_ACTIVITY_CLEAR_TOP
  如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图。

答案 1 :(得分:0)

虽然调用intent会传递一个名为activity clear的标志,如下所示:

Intent newIntent=new Intent(this,MainActivity.class);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(newIntent);

答案 2 :(得分:0)

第1步:为结果A启动激活 - > B - > C1-> C2 .. 使用startActivityForResult

调用您的Activity
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完成时,会调用previsus stack activit的 onActivityResult 。所以你可以检查C1和B onActivityResult 是否你已设置任何结果bck ..并相应完成 并在活动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();
       }
    }

答案 3 :(得分:0)

你可以用这个: 在A活动中传递给B活动时,应该使用标志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。

答案 4 :(得分:0)

这个完整的例子可以帮助你...

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();
            }
        });
    }
}

答案 5 :(得分:0)

在活动C中,当按下后退按钮时,启动活动A,如下所示:

@Override
public void onBackPressed() {
  Intent intent = new Intent(getApplicationContext(), A.class);
  intent.putExtra("EXIT", true);
  startActivity(intent);
}

然后在活动A的onCreate()中执行此操作

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