完成另一项活动的活动

我想从另一个活动完成一个活动,如:

在Activity [A]中,点击button时,我正在调用Activity [B]而没有结束Activity [A]。

现在在活动[B]中,有两个button, 新build修改 。 当用户点击修改,然后从堆栈中popup一个活动[A],并勾选所有选项。

但是当用户点击Activity [B]中的Newbutton时,我将必须从堆栈中完成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]中,点击button:

 setResult(1); finish(); 
  1. 在manifest文件中launchMode = "singleInstance"你的activity: launchMode = "singleInstance"

  2. 当用户点击新的,做FirstActivity.fa.finish(); 并调用新的意图。

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

第一种方式

在你的第一个活动中,像这样声明一个Activity object

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

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

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

第二种方法

在您移动之后立即调用您想要完成的FirstActivity活动时,您可以在调用FirstActivity添加标志

 intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 

但是使用这个标志,即使你不想要它,活动也会完成。 有时如果你想显示FirstActivity你将不得不打电话使用意图。

你可以做,但我认为你不应该打破正常的活动stream程。 如果你想完成你的活动,那么你可以简单地从你的活动B发送广播到活动A.

在开始活动之前创build一个广播接收器B:

 BroadcastReceiver broadcast_reciever = 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(broadcast_reciever, new IntentFilter("finish_activity")); 

当您想从B完成活动A时,将活动B的广播发送到活动A.

 Intent intent = new Intent("finish_activity"); sendBroadcast(intent); 

我希望它会为你工作…

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

尝试类似的东西。

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

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

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

第二步:如果用户点击修改button,使用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(); 

第三步:如果用户点击修改button,使用FLAG_ACTIVITY_CLEAR_TOP启动活动A,并且通过额外的标志。

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

Step4:现在在Activity A的onCreate()方法中,写下面的代码。

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

看到我的答案堆栈溢出问题完成所有以前的活动

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

另一件你需要的是SINGLE_TOP标志。 有了这个,你可以防止Android创build一个新的活动,如果有一个已经在堆栈中创build的。

只是要小心,如果活动已经创build,这些标志的意图将在目标活动中的onNewIntent(intent)方法中onNewIntent(intent) (您需要重载它来处理它)。

然后在onNewIntent有一个叫做restart的方法,或者调用finish()并启动一个新的intent,或者有一个repopulate()方法来设置新的数据。 我更喜欢第二种方法,它比较便宜,你总是可以将onCreate逻辑提取到一个单独的方法,你可以调用它来填充。

我希望你看看这里的分享。 它工作完全没有麻烦。

活动a

 public static ActivityA instance = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); instance = this; } @Override public void finish() { super.finish(); instance = null; } 

活动b

 public void onCreate(Bundle savedInstanceState) { if(ActivityA.instance != null) { try { ActivityA.instance.finish(); } catch (Exception e) {} } } 

我觉得我有最简单的方法

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

我刚应用了Nepster的解决scheme,就像一个魅力。 有一个小的修改,从片段运行它。

到你的片段

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

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

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