我昨天发布了一个问题,因为我有一些特殊的要求似乎很难用android实现。
我正在开发一个显示敏感数据的应用程序,并且要求是每当另一个应用程序获得焦点或应用程序进入后台时,因为按下主页按钮,应用程序应导航到登录页面。
当按下“所有打开的应用程序”(不确定名称)按钮时,应用程序也应该转到登录页面,因为这不应显示当前打开活动的屏幕截图,但应显示登录活动。< / p>
我一直在玩下面代码的变体:
@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中实现的......
有人可以告诉我如何改变活动的意图但是让应用程序保持在后台吗?
答案 0 :(得分:1)
您可以使用onPause
生命周期回调检测您的活动进入后台。简单/天真的解决方案是在onPause中设置一个布尔标志为true,并在onResume
中检查该标志,如果设置了标志,则将用户发送到您的登录活动。
为了解决所有应用程序&#34;按钮,您可以在onPause
中删除内容或清空您的观看次数。
答案 1 :(得分:0)
我设法让一切都在用于我的用例,以一种非常简单的方式,这可能对将来想要这样做的人有用,我不再使用onTrimMemory()了:
1)当用户登录时,我设置了一个全局变量isLoggedIn,每当我向应用程序中的另一个屏幕触发新意图时,我都会设置一个变量:
public class GlobalData extends Application
public static boolean inTransition = false;
public static boolean isLoggedIn = false;
2)在每个活动onPause()和onResume()中创建了2个方法:
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();
}
从我做过的少量测试中,这似乎是按下主页按钮并按下所有正在运行的应用程序&#39;按钮并转发到登录屏幕。
6)我做的最后一件事,特别是我的用例是我不想要所有正在运行的应用程序&#39;按钮显示按下屏幕时的屏幕截图,所以在每个活动中我已将以下行添加到onCreate()方法以禁用屏幕截图:getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);