知道何时显示密码锁定

Che*_*wie 7 android locking

我正在开发一个应用程序,需要在用户离开应用程序并返回时显示密码屏幕(无论是通过屏幕锁定,还是通过后面或主页按钮返回主屏幕).我使用以下工作:

启动活动将在启动时调用密码检查,并且每个活动都将以下功能添加到其onPause方法中:

@Override
public void onPause() {
    super.onPause();

    if (!isFinishing()) {
    new PasscodeCheckTask(this.getApplicationContext(),this).execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

PassocdeCheckTask如下所示.它会检查屏幕是否已关闭或应用程序是否不在后台

public class PasscodeCheckTask extends AsyncTask<Void, Void, Boolean> {

    public static final int CHECK_PASSCODE = 0;

    private Context mActivityApplicationContext;
    private Context mActivityContext;

    public PasscodeCheckTask(Context applicationContext, Context activityContext){
        mActivityApplicationContext = applicationContext;
        mActivityContext = activityContext;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        Boolean result = false;

        if (!((PowerManager)mActivityApplicationContext.getSystemService(android.content.Context.POWER_SERVICE)).isScreenOn() ||
            !isAppOnForeground(mActivityApplicationContext)) {
            result = true;
        }
        return result;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            // Start passcode activity to check for passcode
            /* CODE HERE */
            ((Activity)mActivityContext).startActivityForResult(intent, CHECK_PASSCODE);
        }
    }

    protected boolean isAppOnForeground(final Context context) {
        List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();

        if (appProcesses == null) {
            return false;
        }

        final String packageName = context.getPackageName();
        for (RunningAppProcessInfo appProcess : appProcesses) {
            if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
                 appProcess.processName.equals(packageName)) {
                return true;
            }
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

完成后,Passcode活动将完成,如果密码未通过,则调用活动将moveTaskToBackground(true).这个系统运行得很漂亮,直到我在带有mikg ROM的HTC Evo上试用它.出于某种原因,appProcess.importance从未显示为IMPORTANCE_FOREGROUND.它始终是IMPORTANCE_BACKGROUND.因此,即使应用程序从未进入后台,密码总是会被提起.

我在那部手机上试过DropBox(它也有密码锁),而且效果很好.我似乎无法找到一种不同的方式来了解应用程序何时进入后台,或者是否从后台带回来.关于如何使这项工作的任何想法?

Com*_*are 4

onStop()每个活动中,使用您离开活动的时间更新静态数据成员。在onStart()每个活动中,检查该时间,如果超过某个超时阈值,则显示您的身份验证活动。允许用户设置超时值,这样如果他们不想每隔几秒就被打扰,他们可以控制它。