完成另一个活动的活动

时间:2012-04-30 05:59:38

标签: android android-intent android-activity

我想完成另一项活动的一项活动,例如:

在活动[A]中,点击按钮,我调用活动[B]而不完成活动[A]。

现在在活动[B]中,有两个按钮,新建修改。当用户点击修改然后从堆栈中弹出活动[A]并勾选所有选项..

但是当用户点击Activity [B]中的 New 按钮时,我将不得不从堆栈中完成Activity [A]并将该Activity [A]重新加载到堆栈中。 / p>

我正在尝试,但我无法从堆栈中完成活动[A] ...我该怎么做?

我使用的代码为:

来自活动[A]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);

同一活动中的另一种方法

public void onActivityResult(int requestCode, int resultCode, Intent intent) {

    if (requestCode == 1)
    {
        if (resultCode == 1) {
            Intent i = getIntent();
            overridePendingTransition(0, 0);
            i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();

            overridePendingTransition(0, 0);
            startActivity(i);
        }
    }
}

在活动[B]中,点击按钮:

setResult(1);
finish();

10 个答案:

答案 0 :(得分:178)

  1. 在清单文件中制作您的活动A:launchMode = "singleInstance"

  2. 当用户点击新内容时,请执行FirstActivity.fa.finish();并调用新的意图。

  3. 当用户点击修改时,请调用新的Intent或完成活动B.

  4. 第一天

    在您的第一个活动中,声明一个Activity object,如此,

    public static Activity fa;
    onCreate()
    {
        fa = this;
    }
    

    现在在另一个Activity中使用该对象来完成这样的第一个活动,

    onCreate()
    {
        FirstActivity.fa.finish();
    }
    

    第二种方式

    在您继续调用您想要完成的活动FirstActivity时, 您可以在调用FirstActivity

    时添加标记
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    

    但是使用此标志即使您不希望活动也会完成。有时onBack如果你想展示FirstActivity,你必须使用意图来调用它。

答案 1 :(得分:76)

您可以这样做,但我认为您不应该打破正常的活动流程。如果您想完成活动,那么您只需将活动B的广播发送到活动A.

在开始活动B之前创建广播接收器:

BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context arg0, Intent intent) {
        String action = intent.getAction();
        if (action.equals("finish_activity")) {
            finish();
            // DO WHATEVER YOU WANT.
        }
    }
};
registerReceiver(broadcastReceiver, new IntentFilter("finish_activity"));

当你想从B

完成活动A时,从活动B向活动A发送广播
Intent intent = new Intent("finish_activity");
sendBroadcast(intent);

我希望它对你有用......

答案 2 :(得分:16)

这是一个相当标准的沟通问题。一种方法是在活动A中使用ResultReceiver:

Intent GotoB=new Intent(A.this,B.class);
GotoB.putExtra("finisher", new ResultReceiver(null) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        A.this.finish();
    }
});
startActivityForResult(GotoB,1);

然后在活动B中你可以按需完成它:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());

尝试类似的东西。

答案 3 :(得分:10)

您可以使用一种方法。

步骤1:从活动A开始活动B

startActivity(new Intent(A.this, B.class));

步骤2:如果用户点击修改按钮,则使用FLAG_ACTIVITY_CLEAR_TOP启动活动A.此外,将标记传递给额外的。

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "modify");
startActivity(i);
finish();

步骤3:如果用户点击“添加”按钮,则使用FLAG_ACTIVITY_CLEAR_TOP启动活动A.此外,将标记传递给额外的。如果目标活动中未定义启动模式,FLAG_ACTIVITY_CLEAR_TOP将清除目标之前的所有已打开活动并重新启动

Intent i = new Intent(B.this, A.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.putExtra("flag", "add");
startActivity(i);
finish();

步骤4:活动A的现在onCreate()方法,需要检索该标志。

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}

答案 4 :(得分:5)

请参阅my answer to Stack Overflow question Finish All previous activities

您需要添加Intent.FLAG_CLEAR_TOP。此标志确保完成堆栈中目标活动之上的所有活动,并显示该活动。

您需要的另一件事是SINGLE_TOP标志。如果已经在堆栈中创建了一个新活动,则可以阻止Android创建新活动。

请注意,如果已经创建了活动,那么这些标记的意图将在目标活动中的名为onNewIntent(intent)的方法中传递(您需要重载它以处理它)。

然后在onNewIntent中,您有一个名为restart的方法或者会调用finish()并向其自身发起新意图的方法,或者使用repopulate()方法设置新数据。我更喜欢第二种方法,它更便宜,你可以随时提取 onCreate逻辑到一个单独的方法,你可以调用populate。

答案 5 :(得分:4)

我刚刚应用了Nepster的解决方案并且像魅力一样工作。从Fragment运行它有一个小修改。

到你的片段

// sending intent to onNewIntent() of MainActivity
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.putExtra("transparent_nav_changed", true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

并且要重新启动活动的OnNewIntent()。

// recreate activity when transparent_nav was just changed
if (getIntent().getBooleanExtra("transparent_nav_changed", false)) {
    finish(); // finish and create a new Instance
    Intent restarter = new Intent(MainActivity.this, MainActivity.class);
    startActivity(restarter);
}

答案 6 :(得分:2)

我认为我有最简单的方法......按下B中的新内容。

Intent intent = new Intent(B.this, A.class);
intent.putExtra("NewClicked", true);
 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

在A中得到它

  if (getIntent().getBooleanExtra("NewClicked", false)) {
        finish();// finish yourself and make a create a new Instance of yours.
      Intent intent = new Intent(A.this,A.class);
      startActivity(intent);
    }

答案 7 :(得分:2)

使用请求代码开始活动:

StartActivityForResult(intent,1003);

您可以从其他任何活动中将其关闭:

FinishActivity(1003);

答案 8 :(得分:1)

我知道这是一个老问题,其中一些方法对我没有用,所以对于任何寻找未来的人或者我的麻烦这对我有用

我覆盖onPause并在该方法中调用了finish()

答案 9 :(得分:0)

首先调用startactivity()而不是使用finish()