Android:停止将新的 activity 应用程序置于前台

Android: Stop new activity bringing app into foreground

我昨天发布了一个问题,因为我有一些似乎很难用 android 实现的特定要求。

我正在开发一个显示敏感数据的应用程序,要求是每当另一个应用程序获得焦点或应用程序进入后台因为按下主页按钮时,应用程序应导航到登录页面。

当按下 'all open apps'(不确定名称)按钮时,该应用程序还应转到登录页面,因为这不应显示当前打开的屏幕截图 activity,但应该显示登录 activity.

我一直在研究以下代码的变体:

@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);

    if(level >= TRIM_MEMORY_UI_HIDDEN && ((!isInputtingPIN && !isLoggedIn) || isLoggedIn)) {

        Log.d("AppGlobalData:", "*************** APP WINDOW IS BEING OBSCURED ***************");
        Intent login = new Intent(this.currentContext, AppEntryPoint.class);
        startActivity(login);
    }
}

这可行,但问题是当按下主页按钮时,应用程序进入后台,但是新意图的触发将应用程序拉回到前台。这也发生在 'all apps' 视图中。

如果我推迟此 Intent 触发直到应用程序返回前台,这很好,但应用程序在返回焦点之前不会移动到登录页面,这意味着如果应用程序在显示敏感信息的页面上数据并按下所有应用程序按钮应用程序的视图显示敏感数据。

这是在 IOS 中通过简单地实施一个方法实现的...

任何人都可以告诉我如何获得更改 activity 的意图但将应用程序保留在后台吗?

您可以使用 onPause 生命周期回调检测您的 Activity 进入后台。 simple/naive 解决方案是在 onPause 中将布尔标志设置为 true,并在 onResume 中检查该标志并将用户发送到您的登录 activity 如果设置了该标志。

为了解决 "all apps" 按钮,您可以删除内容或清空 onPause 中的视图。

我设法让所有的东西都为我的用例工作,以一种非常简单的方式,这可能对将来想要这样做的任何人有用,我不再使用 onTrimMemory() 了:

1) 当用户登录时,我设置了一个全局变量 isLoggedIn,每当我在我的应用程序中触发另一个屏幕的新意图时,我都会设置一个变量:

public class GlobalData extends Application

public static boolean inTransition = false;
public static boolean isLoggedIn = false;

2) 创建了 2 个要在每个活动 onPause() 和 onResume() 中实现的方法:

public static void onResumeHandler(Context context) {
    inTransition = false;

    if(!isLoggedIn) {
        Intent login = new Intent(context, AppEntryPoint.class);
        context.startActivity(login);
    }
}

public static void onPauseHandler() {
    if(!inTransition) {
        isLoggedIn = false;
    }
}

3) 每次我在我的应用程序中触发一个新的意图时设置转换指示器变量:

case R.id.map_settings:
     GlobalData.inTransition = true;
     intent = new Intent(this, MapPreference.class);
     this.startActivity(intent);
     break;

4) 在活动中调用处理程序:

@Override
public void onResume() {
    GlobalData.onResumeHandler(this);

    super.onResume();
}

@Override
public void onPause() {
    GlobalData.onPauseHandler();

    super.onPause();
}

5) 在首选项活动中,我还必须处理 onBackPressed(),因为在那些情况下,我不会触发离开首选项屏幕的新意图,而是按下后退按钮:

@Override
public void onBackPressed() {
    GlobalData.inTransition = true;

    super.onBackPressed();
}

从我所做的少量测试来看,这似乎可以处理按下主页按钮和按下 'All running apps' 按钮并转发到登录屏幕。

6) 我所做的最后一件事,具体到我的用例是,我不希望 'All running apps' 按钮在每个 [=34] 按钮被按下时显示屏幕截图=] 我已将以下行添加到 onCreate() 方法以禁用屏幕截图:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);