Android 当应用程序从后台进入前台时启动特定活动
在我正在开发的应用程序中,有些屏幕需要密码保护。因此,如果用户离开应用程序(按home键或其他应用程序进入前台或屏幕关闭),并在一段时间(30秒)后返回,则应用程序应该在显示他离开的屏幕之前询问密码(显示密码屏幕) 到目前为止,我尝试的是:Android 当应用程序从后台进入前台时启动特定活动,android,android-activity,Android,Android Activity,在我正在开发的应用程序中,有些屏幕需要密码保护。因此,如果用户离开应用程序(按home键或其他应用程序进入前台或屏幕关闭),并在一段时间(30秒)后返回,则应用程序应该在显示他离开的屏幕之前询问密码(显示密码屏幕) 到目前为止,我尝试的是: 在应用程序类别I中,使用ActivityLifecycleCallbacks跟踪活动生命周期,并触发两个事件,一个是当应用程序进入后台时,另一个是当它返回前台时 在“后台”事件中,我跟踪当前时间戳。然后在“前台”事件中,我检查应用程序是否处于后台30秒,如
- 在
类别I中,使用应用程序
跟踪活动生命周期,并触发两个事件,一个是当应用程序进入后台时,另一个是当它返回前台时ActivityLifecycleCallbacks
- 在“后台”事件中,我跟踪当前时间戳。然后在“前台”事件中,我检查应用程序是否处于后台30秒,如果是,则告诉当前的
活动启动密码屏幕
有没有更好的方法让密码屏幕先出现 您所描述的是java继承的一个非常好的基本用例,可以通过从activity类继承的基类轻松解决 首先,我们创建一个基类:
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.
必须是方法中的第一行,因此在验证时间戳之前不会调用我们活动中的任何内容这听起来像是黑客攻击,主要是因为它是。您可以使应用程序类确定后台/前台逻辑,如下所示:
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);
}
这可能适用于您的用例。为什么不从应用程序类本身启动密码活动(使用clear_top标志)?@Shaishav这正是我所做的,但它不能解决这个问题。我将启动委托给内容活动,因为它知道它是否需要密码保护。您是否使用
onActivityPaused()
和onActivityResumed()
应用程序类中用于确定应用程序是否进入前台/后台的生命周期方法?@Shaishav使用开始
和停止
事件。@Shaisab跟踪应用程序前台/后台状态的逻辑已经存在并正在运行。谢谢你建议的视图覆盖,如果我不能解决这个问题,我也在考虑模糊敏感内容。哦……这就是为什么我问你用什么方法来解决这个问题。然而,我家停电了,所以我在发布我的答案之前无法得到您的回复,而我在电源恢复后就这么做了。:)