从当前活动完成堆栈中的所有先前活动?

Pri*_*tam 11 android

如何完成应用程序堆栈中的任何先前活动(在任何级别,我的意思不是直接的父级),从当前活动,如某些特定事件,我想要使之前的活动无效?有帮助吗?谢谢.

Rya*_*yan 28

我知道这个答案可能会迟到,但我仍然会发布它以防万一有人正在寻找这样的东西.

我做的是我在中声明了一个静态处理程序 ACTIVITY_A

public static Handler h;
Run Code Online (Sandbox Code Playgroud)

在我的onCreate()方法中ACTIVITY_A,我有

h = new Handler() {

        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch(msg.what) {

            case 0:
                finish();
                break;

            }
        }

    };
Run Code Online (Sandbox Code Playgroud)

现在,从这个之后的任何活动,例如ACTIVITY_B,或者ACTIVITY_C我可以打电话

ACTIVITY_A.h.sendEmptyMessage(0);
Run Code Online (Sandbox Code Playgroud)

然后调用finish()ACTIVITY_A和当当!ACTIVITY_A是从不同的活动完成的.

  • 请注意,在这种情况下,静态处理程序对象将保留对Activity_A的引用.您可以泄漏整个Activity_A. (2认同)
  • 但你不能那样做。Finish() 是非静态的。静态函数不能调用非静态函数。我很迷惑。 (2认同)

Kar*_*oly 5

所以我厌倦了这个,但在我做了更深入的测试后没有用(我把它留在这里以供将来参考): android:clearTaskOnLaunch

例如,假设有人从主屏幕启动活动 P,然后从那里转到活动 Q。用户接下来按下 Home,然后返回活动 P。通常,用户会看到活动 Q,因为这就是他们最后在 P 的任务中做。但是,如果 P 将此标志设置为“true”,则当用户按下 Home 并且任务转到后台时,它上面的所有活动(在本例中为 Q)都将被删除。所以用户在返回任务时只能看到 P。

https://developer.android.com/guide/topics/manifest/activity-element.html

更新 这确实有效

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)


Pri*_*tam 2

这可以通过使用静态变量来实现。就像使用布尔变量activity_name_dirty = false; 一旦发生使该特定活动无效的条件,请立即将其标记为 true。因此,稍后在调用此活动时,请随时检查 Activity_name_dirty 的状态。然后,您可以使用活动标志来创建新的瞬间,如活动基础知识中所述