完成另一项活动的活动
我想从另一个活动完成一个活动,如:
在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();
-
在manifest文件中
launchMode = "singleInstance"
你的activity:launchMode = "singleInstance"
-
当用户点击新的,做
FirstActivity.fa.finish();
并调用新的意图。 -
当用户点击修改时,调用新的意图或简单地完成活动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()
。