在我正在开发的应用程序中,某些屏幕需要受密码保护。因此,如果用户离开应用程序(通过按家或其他应用程序进入前台或屏幕关闭)并在一段时间(30秒)后返回,应用程序应该要求输入密码(显示密码屏幕)显示他离开的屏幕。
到目前为止我尝试的是:
在Application
课程中,我使用ActivityLifecycleCallbacks
跟踪活动生命周期并触发2个事件,一个是应用程序进入后台时的事件,另一个是当它返回前台时。
在'background'事件中,我跟踪当前时间戳。然后在'前景'事件中,我检查应用程序是否在后台持续30秒,如果是,则告诉当前Activity
启动密码屏幕。
这没关系。但问题是,这样一来,受保护的内容/屏幕可以显示一段时间,直到启动密码屏幕(因为内容屏幕本身启动了密码屏幕)。
有没有更好的方法来实现密码屏幕?
答案 0 :(得分:0)
您所描述的是java继承的基本用例,可以通过从活动类继承的基类轻松解决。
首先我们创建一个基类:
public class NeedPasswordActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
//Check time stamp here
}
@Override
protected void onPause() {
super.onPause();
//Set time step here
}
}
然后,在需要进行密码验证的每项活动中,我们都会继承NeedPasswordActivity
:
public class NeedToHavePassowrdActivity extends NeedPasswordActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume(); //call the code from our NeedPasswordActivity and check time stamp before loading the activity
}
@Override
protected void onPause() {
super.onPause(); //call the code from our NeedPasswordActivity and set time stamp
}
}
重要提示:super.
必须是方法中的第一行,因此在验证时间戳之前,我们的活动不会被调用
答案 1 :(得分:0)
这可能听起来像是黑客,主要是因为它。您可以使应用程序类确定后台/前台逻辑如下:
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
public boolean userLoggedOff;
private Handler mHandler;
...
@Override
public void onActivityResumed(Activity activity) {
Log.i("Activity Resumed", activity.getLocalClassName());
if (userLoggedoff)
startPasswordActivity()
else {
mHandler.cancelCallbacksAndMessages(null);
userLoggedOff = false;
}
}
@Override
public void onActivityPaused(Activity activity) {
Log.i("Activity Paused", activity.getLocalClassName());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
userLoggedOff = true;
}
}, 30000);
}
...
}
这将在任何活动暂停后立即关闭用户,但不会在30秒内恢复任何活动。现在,为了解决即时显示敏感信息的情况,我们可以添加一个覆盖整个屏幕的视图到每个敏感活动布局,以隐藏屏幕,直到我们确定用户合法性。然后,在每个这样的活动中,我们可以添加:
@Override
protected void onResume() {
if (!((MyApplication) getApplicatio()).userLoggedOff))
(findViewByID(R.id.opaqueView)).setVisibility(View.INVISIBLE);
}
这可能适用于您的用例。