完成另一个活动的活动

Kan*_*ika 93 android android-intent android-activity

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

在活动[A]中,单击按钮时,我调用活动[B]而不完成活动[A].

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

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

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

我使用的代码如下:

来自活动[A]:

Intent GotoB = new Intent(A.this,B.class);
startActivityForResult(GotoB,1);
Run Code Online (Sandbox Code Playgroud)

同一活动中的另一种方法

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

setResult(1);
finish();
Run Code Online (Sandbox Code Playgroud)

MKJ*_*ekh 184

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

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

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

第一种方式

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

public static Activity fa;
onCreate()
{
    fa = this;
}
Run Code Online (Sandbox Code Playgroud)

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

onCreate()
{
    FirstActivity.fa.finish();
}
Run Code Online (Sandbox Code Playgroud)

第二种方式

在您FirstActivity继续前往调用您想要完成的活动时,您可以在呼叫时添加标记FirstActivity

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
Run Code Online (Sandbox Code Playgroud)

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

  • 您正在持有对活动的静态引用.除非你从某个地方手动清除它,否则它永远不会消失 - >你正在创建内存泄漏! (83认同)
  • 很棒的答案.. !! (6认同)
  • 嗯,好吧,你有我的+1开箱即用的想法:D,我只会改为singleTop.在做类似的事情时,它仍然不是我的第一选择.通过清理代码我的意思是摆脱静态引用的方法,所以没有内存泄漏,但这取决于应用程序结构. (5认同)
  • 请没有人使用第一个解决方案,这是完全错误的.在创建僵尸对象的同时,你正在以一种非常黑客的方式绕过Android框架.使用BroadcastReceiver. (5认同)

Bha*_*rma 80

你可以做,但我认为你不应该打破正常的活动流程.如果您想完成活动,那么您只需将活动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"));
Run Code Online (Sandbox Code Playgroud)

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

Intent intent = new Intent("finish_activity");
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)

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

  • 不要忘记使用`unregisterReceiver()`取消注册`broadcast_receiver` (10认同)
  • "你不应该打破正常的活动流程"+1为此 (2认同)

Fem*_*emi 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);
Run Code Online (Sandbox Code Playgroud)

然后在活动B中你可以按需完成它,如下所示:

((ResultReceiver)getIntent().getExtra("finisher")).send(1, new Bundle());
Run Code Online (Sandbox Code Playgroud)

尝试类似的东西.

  • +1 just,((ResultReceiver)getIntent().getParcelableExtra("finisher")).send(1,new Bundle()); (6认同)

Dha*_*dra 11

您可以在您的案例中使用一种方法.

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

startActivity(new Intent(A.this, B.class));
Run Code Online (Sandbox Code Playgroud)

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

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

步骤3:如果用户单击"添加"按钮,则使用FLAG_ACTIVITY_CLEAR_TOP.Also 启动活动A ,将标记传递给extra.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();
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

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

StartActivityForResult(intent,1234);
Run Code Online (Sandbox Code Playgroud)

您可以从任何其他活动中关闭它,如下所示:

finishActivity(1234);
Run Code Online (Sandbox Code Playgroud)


DAr*_*rkO 5

请参阅我对Stack Overflow问题的答案完成以前的所有活动.

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

你需要的另一件事是SINGLE_TOP旗帜.如果已经在堆栈中创建了一个新活动,则可以阻止Android创建新活动.

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

然后onNewIntent你有一个叫做restart的方法或者会调用finish()并启动一个新意图的repopulate()方法,或者有一个方法来设置新数据.我更喜欢第二种方法,它更便宜,你可以随时将onCreate逻辑提取 到一个单独的方法,你可以调用populate.


kor*_*ras 5

我刚刚应用了 Nepster 的解决方案,效果非常好。有一个小的修改可以从片段运行它。

到你的片段

// 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);
Run Code Online (Sandbox Code Playgroud)

以及您想要重新启动的 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);
}
Run Code Online (Sandbox Code Playgroud)