我想完成另一项活动的一项活动,例如:
在活动[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();
答案 0 :(得分:178)
在清单文件中制作您的活动A:launchMode = "singleInstance"
当用户点击新内容时,请执行FirstActivity.fa.finish();
并调用新的意图。
当用户点击修改时,请调用新的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
,你必须使用意图来调用它。
答案 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()