Знайте, когда показывать блокировку паролем

Я разрабатываю приложение, которое должно отображать экран с паролем всякий раз, когда пользователь покидает приложение и возвращается (будь то через блокировку экрана или возвращение на главный экран через задний или домашний экран) Кнопка). У меня это работало, используя следующее:

Начальное действие будет вызывать проверку пароля при запуске, и каждое действие добавило следующие функции к их методу onPause:

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

    if (!isFinishing()) {
    new PasscodeCheckTask(this.getApplicationContext(),this).execute();
    }
}

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;
    }
}

Действие кода доступа завершится, когда оно будет выполнено, и действие вызова переместитTaskToBackground (true), если код доступа не пройдет. Эта система прекрасно работала, пока я пробовал на HTC Evo с mikg RO М. По какой-то причине appProcess.importance никогда не отображался как IMPORTANCE_FOREGROUND. Это всегда было IMPORTANCE_BACKGROUND. Таким образом, код доступа ВСЕГДА будет отображаться, даже если приложение никогда не переходило в фоновый режим.

Я попробовал DropBox на этом телефоне (у которого тоже есть блокировка паролем), и он отлично сработал. Кажется, я не могу найти другого способа узнать, когда приложение перешло в фоновый режим или возвращается ли оно из фона.Есть идеи, как это сделать?

7
задан dmon 9 February 2012 в 21:37
поделиться