112

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

在 Activity [A] 中,单击按钮时,我正在调用 Activity [B] 而不完成 Activity [A]。

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

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

我正在尝试,但我无法从堆栈中完成 Activity [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();
4

10 回答 10

193
  1. 在清单文件中创建您的活动 A:launchMode = "singleInstance"

  2. 当用户单击新建时,执行FirstActivity.fa.finish();并调用新的 Intent。

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

第一种方式

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你将不得不使用意图来调用它。

于 2012-04-30T06:40:37.947 回答
104

你可以这样做,但我认为你不应该打破正常的活动流程。如果你想完成你的活动,那么你可以简单地从你的活动 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);

我希望它对你有用...

于 2012-04-30T06:14:07.660 回答
20

这是一个相当标准的沟通问题。一种方法是在活动 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());

尝试类似的东西。

于 2012-04-30T06:15:21.657 回答
12

您可以在您的情况下使用一种方法。

Step1:从Activity A启动Activity B

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

Step2:如果用户点击修改按钮启动Activity A,使用FLAG_ACTIVITY_CLEAR_TOP.Also,额外传递flag。

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

第三步:如果用户点击添加按钮,使用 .Also 启动 Activity A FLAG_ACTIVITY_CLEAR_TOP,额外传递标志。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();

Step4:现在onCreate()Activity A的方法,需要检索那个标志。

String flag = getIntent().getStringExtra("flag");
if(flag.equals("add")) {
    //Write a code for add
}else {
    //Write a code for modifying
}
于 2012-04-30T06:44:18.940 回答
8

使用请求代码开始您的活动:

StartActivityForResult(intent,1234);

你可以从任何其他活动中关闭它:

finishActivity(1234);
于 2018-07-12T14:23:06.217 回答
5

请参阅我对 Stack Overflow 问题Finish All previous activity的回答。

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

您需要的另一件事是SINGLE_TOP旗帜。如果堆栈中已经创建了一个活动,则使用这个可以防止 Android 创建一个新活动。

请注意,如果活动已经创建,带有这些标志的意图将onNewIntent(intent)在目标活动中调用的方法中传递(您需要重载它来处理它)。

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

于 2012-04-30T06:12:58.200 回答
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);

对于您想要重新启动的 Activity 的 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);
}
于 2015-03-29T12:01:44.047 回答
2

我认为我有最简单的方法...在 B 中按 new ..

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);
    }
于 2014-06-26T14:45:02.980 回答
1

我知道这是一个老问题,其中一些方法对我不起作用,所以对于任何展望未来或遇到麻烦的人来说,这对我有用

我覆盖onPause并在该方法内部调用finish()

于 2017-09-09T03:34:16.010 回答
-3

先调用startactivity()后使用finish()

于 2018-01-29T15:42:43.340 回答