Android 当应用程序从后台进入前台时启动特定活动

Android 当应用程序从后台进入前台时启动特定活动,android,android-activity,Android,Android Activity,在我正在开发的应用程序中,有些屏幕需要密码保护。因此,如果用户离开应用程序(按home键或其他应用程序进入前台或屏幕关闭),并在一段时间(30秒)后返回,则应用程序应该在显示他离开的屏幕之前询问密码(显示密码屏幕) 到目前为止,我尝试的是: 在应用程序类别I中,使用ActivityLifecycleCallbacks跟踪活动生命周期,并触发两个事件,一个是当应用程序进入后台时,另一个是当它返回前台时 在“后台”事件中,我跟踪当前时间戳。然后在“前台”事件中,我检查应用程序是否处于后台30秒,如

在我正在开发的应用程序中,有些屏幕需要密码保护。因此,如果用户离开应用程序(按home键或其他应用程序进入前台或屏幕关闭),并在一段时间(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跟踪应用程序前台/后台状态的逻辑已经存在并正在运行。谢谢你建议的视图覆盖,如果我不能解决这个问题,我也在考虑模糊敏感内容。哦……这就是为什么我问你用什么方法来解决这个问题。然而,我家停电了,所以我在发布我的答案之前无法得到您的回复,而我在电源恢复后就这么做了。:)