我昨天发布了一个问题,因为我有一些特定的要求,这些要求似乎很难用android实现。
我正在开发一款显示敏感数据的应用程序,其中一项要求是,每当另一款应用程序获得焦点或该应用程序因按下主页按钮而进入后台时,该应用程序都应导航到登录页面。
当按下"所有打开的应用程序"(不确定名称)按钮时,应用程序也应进入登录页面,因为这不应显示当前打开活动的屏幕截图,而应显示登录活动。
我一直在玩以下代码的变体:
@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);
}
}
这是有效的,但问题是,当按下主页按钮时,应用程序会进入后台,但这种新意图的激发会将应用程序拉回到前台。这也发生在"所有应用程序"视图中。
如果我将此意向激发推迟到应用程序返回前台,这很好,但应用程序在返回焦点之前不会移动到登录页面,这意味着如果应用程序在显示敏感数据的页面上,并且按下了所有应用程序按钮,则应用程序的视图将显示敏感数据。
这是在IOS中通过简单地实现单一方法实现的。。。
有人能告诉我我如何才能改变活动,但将应用程序保留在后台吗?
您可以通过onPause
生命周期回调来检测进入后台的"活动"。简单/天真的解决方案是在onPause中将布尔标志设置为true,并在onResume
中检查该标志,如果设置了该标志,则将用户发送到登录活动。
为了绕过"所有应用程序"按钮,您可以在onPause
中删除内容或清空视图。
我设法以一种非常简单的方式使我的用例中的一切都正常工作,这可能对将来想要这样做的人有用,我不再使用onTrimMemory():
1) 当用户登录时,我将全局变量设置为LoggedIn,每当我在应用程序中的另一个屏幕上触发新意图时,我都会设置一个变量:
public class GlobalData extends Application
public static boolean inTransition = false;
public static boolean isLoggedIn = false;
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();
}
从我所做的少量测试来看,这似乎可以处理按下主页按钮和"所有正在运行的应用程序"按钮并转发到登录屏幕。
6) 具体到我的用例,我做的最后一件事是,我不希望"所有正在运行的应用程序"按钮在按下时显示屏幕截图,所以在每个活动中,我都在onCreate()方法中添加了以下行来禁用屏幕截图:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);