Я разрабатываю приложение, которое должно отображать экран с паролем всякий раз, когда пользователь покидает приложение и возвращается (будь то через блокировку экрана или возвращение на главный экран через задний или домашний экран) Кнопка). У меня это работало, используя следующее:
Начальное действие будет вызывать проверку пароля при запуске, и каждое действие добавило следующие функции к их методу 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 на этом телефоне (у которого тоже есть блокировка паролем), и он отлично сработал. Кажется, я не могу найти другого способа узнать, когда приложение перешло в фоновый режим или возвращается ли оно из фона.Есть идеи, как это сделать?