当应用从后台

时间:2016-07-30 05:50:31

标签: android android-activity

在我正在开发的应用程序中,某些屏幕需要受密码保护。因此,如果用户离开应用程序(通过按家或其他应用程序进入前台或屏幕关闭)并在一段时间(30秒)后返回,应用程序应该要求输入密码(显示密码屏幕)显示他离开的屏幕。

到目前为止我尝试的是:

  • Application课程中,我使用ActivityLifecycleCallbacks跟踪活动生命周期并触发2个事件,一个是应用程序进入后台时的事件,另一个是当它返回前台时。

  • 在'background'事件中,我跟踪当前时间戳。然后在'前景'事件中,我检查应用程序是否在后台持续30秒,如果是,则告诉当前Activity启动密码屏幕。

这没关系。但问题是,这样一来,受保护的内容/屏幕可以显示一段时间,直到启动密码屏幕(因为内容屏幕本身启动了密码屏幕)。

有没有更好的方法来实现密码屏幕?

2 个答案:

答案 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);
}

这可能适用于您的用例。