在onPause()中调用finish(),但在屏幕方向改变时不要调用。

4
我有一个应用程序需要在某人退出其主要活动时调用“finish”,即使按home键也是如此(所以我不想让它被暂停),以处理这个问题,目前我只需在我的“onPause()”方法中调用“finish()”,因为一切都是用碎片完成的,它工作得很好,没有稳定性问题。
我唯一的问题是我不能处理方向更改,因为“onPause()”在“onConfigurationChanged()”之前被调用(当旋转发生时,允许我禁用此行为)。
我可以创建一个处理程序来处理此事,但它太复杂了。
有什么想法?

你想让你的应用程序每次启动时都从MainActivity开始吗?也就是说,如果你的应用程序在B活动中,用户按下主页键,那么当应用程序再次启动时,它会从MainActivity开始而不是B活动开始? - Hoan Nguyen
如果在onStop()之前调用了onConfigurationChanged(),则可以在其中调用finish() - rciovati
@HoanNguyen 我没有B活动,只有一个活动。 - JohnUopini
@rciovati 我想在 onPause() 期间调用 finish(),如果我在 "onStop()" 调用 finish(),当它暂停时活动不会结束。 - JohnUopini
4个回答

7
您可以使用 onWindowFocusChanged 事件来替换 onPause。当屏幕方向发生变化时,不会调用此函数。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    Log.d(TAG, "FOCUS = " + hasFocus);
    if (!hasFocus) finish();
}

但是请注意:当活动仍然可见时(例如onPause()),此事件被调用,如果您想在活动真正完全不可见时结束活动,则应使用onStop:

private boolean isInFocus = false;

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    Log.d(TAG, "FOCUS = " + hasFocus);
    isInFocus = hasFocus;
}

@Override
public void onStop() {
    super.onStop();
    if (!isInFocus) finish();
}

谢谢你解决我的问题 - 我想找到一种区分应用程序最小化和方向更改的方法。 - John Roberts

3

很简单,只需执行以下操作:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        display = ((WindowManager) getSystemService(WINDOW_SERVICE))
                .getDefaultDisplay();
        orientation = display.getOrientation();

    }

@Override
    protected void onPause() {
        // TODO Auto-generated method stub

        int orientation_ = display.getOrientation();
        if (orientation_ != orientation) {
            finish();
        }
        Log.e("hello=---->", "onPause");
        super.onPause();
    }

0
从你的问题来看,似乎你只有一个活动,在这种情况下,你应该在清单文件中设置一个标志。在你的MainActivity清单文件中添加即可。
android:clearTaskOnLaunch="true"

谢谢Hoan,这将清除启动时的活动,但它不会在退出时完成,因为我需要重新启动服务并在退出时释放一些内存,所以我需要在退出时完成。 - JohnUopini
为什么在onStop()中不能调用finish()方法? - Hoan Nguyen
如果您只是暂停活动,则不会调用onStop(),而我想在暂停期间完成。 - JohnUopini

0
你可以监听屏幕方向的变化,在变化事件中存储一个布尔值,例如:
boolean orientationChanging;

当方向改变时将其设置为true,之后设置为false,然后在您的onPause中执行:

@Override
protected void onPause() {

    if(!orientationChanging){
                finish();
            }
}

这样做不起作用,因为 onConfigurationChanged 永远不会被调用(首先调用 onPause)。 - JohnUopini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接